【问题标题】:Mocking JavascriptSerializer results in error模拟 JavascriptSerializer 导致错误
【发布时间】:2013-07-02 12:13:56
【问题描述】:

您好,我已经在 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)

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

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    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);
    

    【讨论】:

      【解决方案2】:
      x.GetJavascriptSerializer().Serialize(userInfoDTO)
      

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

      你想要的是这样的:

      public class JavascriptSerializerWrapper : IJavascriptSerializerWrapper
      {
          private JavascriptSerializer _serializer = new JavascriptSerializer();
          public JavaScriptSerializer Serialize()
          {
              return _serializer.Serialize();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 2019-05-18
        • 2019-02-07
        • 1970-01-01
        • 2020-10-02
        相关资源
        最近更新 更多