繁体   English   中英

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

[英]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>值,它将值放在里面。

基本上:

  1. 如果框值的空值,你得到的值的盒装版本,这样的盒装版(int?)1相同的盒装版1
  2. 如果您装入一个没有值的可空值,则会得到一个没有类型的空引用

您可以将拳击操作视为与此类似:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM