2017-03-28 4 views
0

https://github.com/Moq/moq4/wiki/Quickstartを通過すると、私はそれがインターフェイスを模擬しているのを見ます。moqモック<MyClass>を使用して、インターフェイスではなくクラスをモックできますか?

私は `モック」私は、インターフェイスを持っていない私のレガシーコードでクラスを持って、私は次の例外を取得:

Additional information: Can not instantiate proxy of class: MyCompnay.Mylegacy.MyClass. 

はどのようにしてレガシーコードからモッククラスに部品番号を使用することができますか?

ありがとうございます。

+0

Moqがプロキシを作成できない理由を説明するエラーメッセージが多分あります。 moqを使っているテストコードと一緒にクラス定義(少なくともコンストラクタ)を含めると、おそらく答えが得られます。 – PatrickSteele

+4

[インタフェースを持たず、C#で仮想メソッドを持たないクラスを模倣する方法]の可能な複製?(http://stackoverflow.com/questions/39356771/how-to-mock-a-class-with-no-interface- and-no-virtual-methods-in-c) –

+0

クラスの例を示します。クラスが封印されていないか、仮想メソッドやプロパティがない場合を除いて、それは嘲笑されるべきです。 – Nkosi

答えて

3

それははそれが公共のクラス

  • 方法を嘲笑するが、仮想
  • でなければなりません具象クラス

    [TestClass] 
    public class PlaceholderParserFixture 
    { 
    
        public class Foo 
        { 
        public virtual int GetValue() 
        { 
         return 11; 
        } 
        } 
    
        public class Bar 
        { 
        private readonly Foo _foo; 
    
        public Bar(Foo foo) 
        { 
         _foo = foo; 
        } 
    
        public int GetValue() 
        { 
         return _foo.GetValue(); 
        } 
        } 
    
        [TestMethod] 
        public void MyTestMethod() 
        { 
        var foo = new Mock<Foo>(); 
        foo.Setup(mk => mk.GetValue()).Returns(16); 
        var bar = new Bar(foo.Object); 
    
        Assert.AreEqual(16, bar.GetValue()); 
        } 
    
    } 
    

    しかし、

    • をモックすることが可能にです

      メッセージタイプMoqFixture + fooはパブリックではありません。クラスの内部

      Castle.DynamicProxy.Generators.GeneratorExceptionを作る

      :■私はためになりました。アクセスできないタイプのプロキシは作成できません。

      または、非仮想メソッドを有する

      System.NotSupportedException:非仮想(VBでオーバーライド)メンバーに無効な設定:MK => mk.GetValue()

      のメッセージがcannot instantiateというメッセージと一致しないため、何か間違っているようです。

      あなたが嘲笑オブジェクトにデフォルトコンストラクタを持っていない場合は、そのエラーメッセージ

      例えばを得ることができます

      public class Foo 
      { 
      
          private int _value; 
          public Foo(int value) 
          { 
           _value = value; 
          } 
      
          public virtual int GetValue() 
          { 
           return _value; 
          } 
      } 
      

      例えばCTOR>モック<に値を渡すことによってこの問題を回避することができ

      var foo = new Mock<Foo>(MockBehavior.Strict, new object[] { 11 }); 
      
    関連する問題