模拟JavascriptDeserializer会导致错误

时间:2018-04-17 15:04:50

标签: c# unit-testing moq

我在JavascriptDeserializer上创建了一个包装器,以便能够使用Moq。

这是我的代码:

public class JavaScriptSerializerWrapper: IJavaScriptSerializerWrapper
{
        public object Deserialize(string data)
        {
            var serializer = new JavaScriptSerializer(); 
            return serializer.Deserialize<T>(data); 
        }
}

现在在我的单元测试中,我试图像这样嘲笑:

private Mock<IJavascriptSerializerWrapper> m_JavascriptSerializerWrapper;

[TestInitialize]
public void Initializer()
{
    m_JavascriptSerializerWrapper = new Mock<IJavaScriptSerializerWrapper>();
}

[TestMethod]
public void Login_IsValidUser_ReturnsTrue()
{
    var deserializedObject = It.IsAny<EmployeeData>();

     m_JavascriptSerializerWrapper.Setup(x => x.GetJavascriptSerializer().Deserialize(userData)).Returns(deserializedObject);
}

我调试了单元测试,我得到的对象引用错误不是对象的实例。

我在这里做错了什么,如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

It.IsAny<>()是一个参数匹配器,不应在SetupVerify表达式之外使用。如果使用,它将返回参数类型的默认值,在本例中为null

[TestMethod]
public void Login_IsValidUser_ReturnsTrue()
{
    var deserializedObject = new EmployeeData() {
        //...
    };

    m_JavascriptSerializerWrapper
        .Setup(_ => _.Deserialize(It.IsAny<string>())) //<-- note use of argument matcher
        .Returns(deserializedObject);

    //...
}

参考Moq Quickstart: Matching Arguments