簡體   English   中英

我可以使用 moq Mock<MyClass> 模擬一個類,而不是一個接口?

[英]Can I use moq Mock<MyClass> to mock a class, not an interface?

通過https://github.com/Moq/moq4/wiki/Quickstart ,我看到它模擬了一個界面。

我的遺留代碼中有一個沒有接口的類。 當我Mock<MyClass> ,出現以下異常:

附加信息:無法實例化類的代理:MyCompnay.Mylegacy.MyClass。

如何使用 Moq 模擬遺留代碼中的類?

可以模擬具體類

[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());
  }

}

但,

  • 必須是公開課
  • 要模擬的方法必須是虛擬的

我收到的消息:

使類成為內部

Castle.DynamicProxy.Generators.GeneratorException:MoqFixture+Foo 類型不是公開的。 無法為不可訪問的類型創建代理。

或者,有一個非虛擬方法

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;
    }
}

可以通過將值傳遞給 Mock<> ctor 來解決這個問題

例如

var foo = new Mock<Foo>(MockBehavior.Strict, new object[] { 11 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM