Замена Rhino Mocks GetArgumentsForCallsMadeOn () для Moq Callback () не получает исходные аргументы - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь заменить эту реализацию Rhino Mocks:

private bool IsHandshakeCalled()
{
    var args = httpExecutorBuilderStub.GetArgumentsForCallsMadeOn(st => st.ExecuteHttpWebRequestAndReturn(
        Arg<HttpMethod>.Is.Anything, Arg<string>.Is.Anything, Arg<string>.Is.Anything));

    if (args.Count > 0)
    {
        return args[0][0].Equals(HttpMethod.POST) &&
               args[0][1].Equals("/api/v2/connection/command") &&
               args[0][2].Equals(JsonConvert.SerializeObject(new HandshakeRequestDto(500)));
    }
    return false;
}

следующей реализацией Moq:

private bool IsHandshakeCalled()
{
    HttpMethod? capturedHttp = null;
    string? capturedString1 = null;
    string? capturedString2 = null;

    httpExecutorBuilderStub.Setup(st => st.ExecuteHttpWebRequestAndReturn(
        It.IsAny<HttpMethod>(), It.IsAny<string>(), It.IsAny<string>()))
        .Callback<HttpMethod, string, string>((h, s1, s2) => {
            capturedHttp = h;
            capturedString1 = s1;
            capturedString2 = s2;
        });

    if (capturedHttp != null)
    {
        return capturedHttp.Equals(HttpMethod.POST) &&
            capturedString1.Equals("/api/v2/connection/command") &&
            capturedString2.Equals(JsonConvert.SerializeObject(new HandshakeRequestDto(500)));
    }
    return false;
}

Проблема в том, что моя реализация Moq не получает исходных аргументов.

Вероятно, у меня проблемы с методом Callback() Moq.

  • Что я делаю не так?
  • Следует ли мне использовать какой-то другой метод Moq?

Ответы [ 2 ]

0 голосов
/ 27 августа 2020

Проблема заключалась в установке макета не в то место. Мне пришлось перенести его на другой метод, чтобы он был настроен раньше.

0 голосов
/ 06 августа 2020

Существует встроенная функция под названием Capture.In, которая может сохранять все параметры вызовов методов в коллекции.

Например:

//Arrange
const string inputString = "ThisWillHandled";
var args = new List<string>();
mockedHandler.Setup(handler => handler.Handle(Capture.In(args)));

var SUT = new SUT(mockedHandler.Object);

//Act
SUT.TheAction(inputString);

//Assert
Assert.AreEqual(args.Count, 1);
Assert.AreEqual(args.First(), inputString);

Применение этого шаблона к вашему коду будет выглядеть так:

private bool IsHandshakeCalled()
{
    //Arrange
    var capturedHttps  = new List<HttpMethod>();
    var capturedStrings1 = new List<string>();
    var capturedStrings2 = new List<string>;

    httpExecutorBuilderStub.Setup(st => st.ExecuteHttpWebRequestAndReturn(
            Capture.In(capturedHttps), Capture.In(capturedStrings1), Capture.In(capturedStrings2)));

    //Act
    //Call the stub via the SUT

    //Assert
    if (capturedHttps.Count == 1)
    {
        return capturedHttps.Single().Equals(HttpMethod.POST) &&
               capturedStrings1.Single().Equals("/api/v2/connection/command") &&
               capturedStrings2.Single().Equals(JsonConvert.SerializeObject(new HandshakeRequestDto(500)));
    }
    return false;
}

Пожалуйста, убедитесь, что вы вызываете метод ExecuteHttpWebRequestAndReturn заглушки через SUT, прежде чем пытаться исследовать захваченные параметры.

...