我可以使用 moq 模拟<MyClass>来模拟类,而不是界面吗?



通过 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。获取值((

与您的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 });

最新更新