Все вызовы на макете должны иметь соответствующую настройку


У меня есть устаревший код, который я хочу протестировать. Я создал первый тест moq, но я получаю следующее исключение:

Moq.MockException: IConnection.SendRequest (ADF.Обмен сообщениями.Договор.ConfigServer.GetDataVersionRequest) вызов не удался с насмешливым поведением строгого. Все призывы на МОК должен иметь соответствующую настройку.

Важные фрагменты кода:

Свойство по классу:

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

Когда я отлаживаю модульный тест, я вижу, что когда прокси.GetVersion выполняется на линии _connection.SendRequest мы получаем ошибку. Кроме того, когда я смотрю переменную (_connection) в окне просмотра, я вижу, что это объект moq. Так что я полагаю, что присвоение собственности прошло хорошо.

Кто-нибудь видит, где я ошибся?

1 3

1 ответ:

Я полагаю, что проблема заключается в следующем:

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

Прокси делает вызов для получения версии приложения, но не использует этот же объект запроса (он, вероятно, создает другой с теми же параметрами). Поскольку это разные объекты и макет настроен на ожидание одного и того же, он терпит неудачу.

Разумным решением было бы ожидатьлюбой запрос типа CentralServiceRequest. Я не очень хорошо разбираюсь в Moq, но я предполагаю, что это что-то вроде этого:

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

Надеюсь, что это помогает.