我在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);
}
我调试了单元测试,我得到的对象引用错误不是对象的实例。
我在这里做错了什么,如何解决这个问题?
答案 0 :(得分:1)
It.IsAny<>()
是一个参数匹配器,不应在Setup
或Verify
表达式之外使用。如果使用,它将返回参数类型的默认值,在本例中为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);
//...
}