1

嗨,我已经在 J​​avascriptSerializer 上创建了一个包装器,以便能够起订量。

这是我的代码:

public class JavascriptSerializerWrapper : IJavascriptSerializerWrapper
{
    public JavaScriptSerializer GetJavascriptSerializer()
    {
        return new JavaScriptSerializer();
    }
}

现在在我的单元测试中,我尝试像这样模拟:

    private Mock<IJavascriptSerializerWrapper> m_JavascriptSerializerWrapper;

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

    [TestMethod]
    public void Login_IsValidUser_ReturnsTrue()
    {
        const string serializedObject = "{\"EmailAddress\":\"kimmiem30@hotmail.com123\",\"StudentId\":1200528,\"TeacherId\":null,\"EmployeeId\":null,\"PersonId\":82249,\"MessageUserId\":410335}";
         m_JavascriptSerializerWrapper.Setup(x => x.GetJavascriptSerializer().Serialize(userInfoDTO)).Returns(serializedObject);
    }

我已经调试了单元测试,我得到了这个错误:

非虚拟(在 VB 中可覆盖)成员的无效设置:x => x.GetJavascriptSerializer().Serialize(.userInfoDTO)

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

4

2 回答 2

2

JavaScriptSerializer.Serialize不是虚拟的,所以不能被嘲笑。相反,您的包装器接口和类应该包含一个Serialize可以模拟的方法。

例如:

public class JavascriptSerializerWrapper : IJavascriptSerializerWrapper
{
    public string Serialize(object toSerialize)
    {
        var serializer = new JavaScriptSerializer();
        return serializer.Serialize(toSerialize);
    }
}

然后您的测试可以像这样使用它:

m_JavascriptSerializerWrapper.Setup(x => x.Serialize(userInfoDTO)).Returns(serializedObject);
于 2013-07-02T12:25:49.693 回答
1
x.GetJavascriptSerializer().Serialize(userInfoDTO)

因此,您不仅要模拟“IJavascriptSerializerWrapper”,还要模拟 JavascriptSerializer 本身

你想要的是这样的:

public class JavascriptSerializerWrapper : IJavascriptSerializerWrapper
{
    private JavascriptSerializer _serializer = new JavascriptSerializer();
    public JavaScriptSerializer Serialize()
    {
        return _serializer.Serialize();
    }
}
于 2013-07-02T12:26:38.073 回答