1

こんにちは、JavascriptSerializer のラッパーを作成して、これを moq できるようにしました。

これは私のコードです:

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 に答える