[英]Moq cannot create mock object of class with nullable parameter in the constructor
我有这门课:
public class TestClass
{
public TestClass(int? foo, string bar)
{
//..Something
}
}
我试图用这样的MOQ来模拟它
var mockA = new Mock<A>(new object[] {(int?)1, string.Empty})
或这个,
var mockA = new Mock<A>(new object[] {1 as int?, string.Empty})
即使这样
var mockA = new Mock<A>(new object[] {(int?)null, string.Empty})
当我试图得到这样的对象
var objA = mockA.Object
它抛出了这个例外
无法实例化类的代理:TestClass。 找不到与给定参数匹配的构造函数:System.Int32,System.String
(对于第三个,它抛出空引用异常)
如何使它识别第一个参数是Nullable System.Int32类型而不是System.Int32。
(请忽略我正在嘲笑一个类,而不是一个接口。)
为了使用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";
}
}
这样做的原因是装入一个可以为空的值并没有真正包装Nullable<T>
值,它将值放在里面。
基本上:
(int?)1
相同的盒装版1
您可以将拳击操作视为与此类似:
public static object Box(int? value)
{
if (value.HasValue)
return value.Value; // boxes the int value
return null; // has no type
}
换句话说,你的object[]
数组根本没有获得可空值的副本,它只获取int
值的副本或null
-reference,它们都不带有Nullable<T>
类型。
这是一些要测试的LINQPad代码:
void Main()
{
int? i = 1;
object o = i;
o.Dump();
o.GetType().Dump();
i = null;
o = i;
o.Dump();
o.GetType().Dump();
}
输出:
1
System.Int32
空值
[的NullReferenceException]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.