c# - 我可以使用 moq Mock<MyClass> 来模拟一个类,而不是一个接口(interface)吗?

标签 c# unit-testing moq

通过 https://github.com/Moq/moq4/wiki/Quickstart ,我看到它模拟了一个界面。

我的遗留代码中有一个没有接口(interface)的类。当我 Mock<MyClass> ,我得到以下异常:

Additional information: Can not instantiate proxy of class: 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: Type MoqFixture+Foo is not public. Can not create proxy for types that are not accessible.

或者,有一个非虚方法

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: mk => mk.GetValue()

与您的cannot instantiate 消息不匹配,所以其他地方似乎是错误的。

如果模拟对象上没有默认构造函数,您会收到该错误消息

例如

public class Foo
{

    private int _value;
    public Foo(int value)
    {
       _value = value;
    }

    public virtual int GetValue()
    {
        return _value;
    }
}

可以通过将值传递给 Mock<> 构造函数来解决这个问题

例如

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

关于c# - 我可以使用 moq Mock<MyClass> 来模拟一个类,而不是一个接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43076415/

相关文章:

c# - ASP.Net - 在 SiteMapPath 中链接网站

javascript - 将 Razor DropDownList 保持在一行上

python - pytest 断言用于 pyspark 数据帧比较

javascript - 抛出错误时不调用 Jasmine afterAll

java - Junit 测试后的数据库清理

c# - 如何在 C# nunit 中断言字典?

web-services - 如何在非常复杂的业务规则上实现 BDD?

c# - 在其构造函数中从 session 中设置项目的模拟对象

c# - 如何为 ASP.Net 自定义控件提供新的自定义事件

c# - visual-studio 2013 是否支持 Windows-mobile 或 Windows-CE 编程?