7

単体テストしたいレガシーコードがあります。最初の moq テストを作成しましたが、次の例外が発生します。

Moq.MockException:IConnection.SendRequest(ADF.Messaging.Contract.ConfigServer.GetDataVersionRequest) の呼び出しは、モックの動作 Strict で失敗しました。モックでのすべての呼び出しには、対応する設定が必要です。

重要なコード:

クラスのプロパティ:

Public Property Connection() As IConnection
    Get
        Return _connection
    End Get
    Set(ByVal value As IConnection)
        _connection = value
    End Set
End Property

テストする必要があるメソッド: (_connection) は、実際には tcp ソケットを作成するクラスであり、そのプロパティをモックして、SendRequest が必要なものを返すようにします。

Public Function GetVersion(ByVal appID As Contract.ApplicationID) As Contract.DataVersion
    EnsureConnected()
    Dim req As GetDataVersionRequest = New GetDataVersionRequest(appID)

    Dim reply As CentralServiceReply = _connection.SendRequest(req) //code I want to mock
    Utils.Check.Ensure(TypeOf reply Is GetDataVersionReply, String.Format("Unexpected type: {0}, expected GetDataVersionReply!", reply.GetType()))

    Dim version As Contract.DataVersion = CType(reply, GetDataVersionReply).Version
    version.UpgradeOwners()
    If (Not version.IsSupported) Then
        Return Contract.DataVersion.UNSUPPORTED
    End If

    Return version
End Function

試験方法:

[TestMethod]
public void TestMethod2()
{
    Contract.CentralServiceRequest req = new Contract.ConfigServer.GetDataVersionRequest(new ApplicationID("AMS", "QA"));

    DataVersion v = new DataVersion();
    v.AppVersion = "16";
    CentralServiceReply reply = new GetDataVersionReply(v);

    var ConnectionMock = new Mock<IConnection>(MockBehavior.Strict);
    ConnectionMock.Setup(f => f.SendRequest(req)).Returns(reply);

    var proxy = new ConfigServerProxy(new ApplicationID("AMS", "QA"), "ws23545", 8001);
    proxy.Connection = ConnectionMock.Object; //assign mock object

    DataVersion v2 = proxy.GetVersion(new ApplicationID("AMS", "QA"));
    Assert.AreEqual(v.AppVersion, v2.AppVersion);
}

単体テストをデバッグすると、proxy.GetVersion が行 _connection.SendRequest で実行されるとエラーが発生することがわかります。また、ウォッチ ウィンドウで変数 (_connection) を見ると、それが moq オブジェクトであることがわかります。それで、プロパティの割り当てはうまくいったと思います。

誰かが私がどこで間違ったのか見ていますか?

4

1 に答える 1

9

問題は次の点にあると思います。

Contract.CentralServiceRequest req = new Contract.ConfigServer.GetDataVersionRequest(new ApplicationID("AMS", "QA"));

Proxy はアプリケーション バージョンを取得するために呼び出しを行いますが、この同じ要求オブジェクトを使用しません (おそらく、同じパラメーターで別の要求オブジェクトを作成します)。それは異なるオブジェクトであり、モックは同じものを期待するように設定されているため、失敗します。

合理的な解決策は、タイプが CentralServiceRequest の要求を期待することです。私はMoqに精通していませんが、次のようなものだと思います:

ConnectionMock.Setup(f => f.SendRequest(ItExpr.IsAny<Contract.CentralServiceRequest>())).Returns(reply);

お役に立てれば。

于 2012-08-16T14:56:59.890 に答える