Moq无法在构造函数中使用可为null的参数创建类的模拟对象

lab*_*roo 7 c# unit-testing nullable moq mocking

我有这门课:

public class TestClass
{
 public TestClass(int? foo, string bar)
 {
   //..Something
 }
}
Run Code Online (Sandbox Code Playgroud)

我试图用这样的MOQ来模拟它

var mockA = new Mock<A>(new object[] {(int?)1, string.Empty})
Run Code Online (Sandbox Code Playgroud)

或这个,

var mockA = new Mock<A>(new object[] {1 as int?, string.Empty})
Run Code Online (Sandbox Code Playgroud)

即使这样

var mockA = new Mock<A>(new object[] {(int?)null, string.Empty})
Run Code Online (Sandbox Code Playgroud)

当我试图得到这样的对象

var objA = mockA.Object
Run Code Online (Sandbox Code Playgroud)

它抛出了这个例外

无法实例化类的代理:TestClass.找不到与给定参数匹配的构造函数:System.Int32,System.String

(对于第三个,它抛出空引用异常)

如何使它识别第一个参数是Nullable System.Int32类型而不是System.Int32.

(请忽略我正在嘲笑一个类,而不是一个接口.)

Ola*_*gen 8

为了使用Moq模拟对象,对象本身必须具有public空构造函数. 您想要模拟的方法必须是virtual为了被覆盖.

编辑:

我正在运行Moq v4.0.20926(来自NuGet的最新版本)以及以下工作:

[TestMethod]
public void TestMethod1()
{
    var mock = new Mock<TestClass>(new object[] {null, null});
    mock.Setup(m => m.MockThis()).Returns("foo");

    Assert.AreEqual("foo", mock.Object.MockThis());
}

public class TestClass
{
    public TestClass(int? foo, string bar)
    {
    }

    public virtual string MockThis()
    {
        return "bar";
    }
}
Run Code Online (Sandbox Code Playgroud)