【问题标题】:Replacement Rhino Mocks GetArgumentsForCallsMadeOn() for Moq Callback() not receiving original arguments替换 Rhino 模拟 GetArgumentsForCallsMadeOn() 用于 Moq Callback() 不接收原始参数
【发布时间】:2020-08-05 15:30:44
【问题描述】:

我正在尝试替换这个 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;
}

使用以下最小起订量实现:

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 实现没有收到原始参数。

可能我对 Moq 的 Callback() 方法有一些问题。

  • 我做错了什么?
  • 我应该使用一些不同的起订量方法吗?

【问题讨论】:

  • 看不到被测对象在哪里锻炼。只有在调用模拟成员时才会调用回调。
  • 如果在执行被测对象后调用它,则应使用Verify 来确认传递的参数

标签: c# .net moq rhino-mocks


【解决方案1】:

有一个名为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;
}

在尝试检查捕获的参数之前,请确保您正在通过 SUT 调用存根的 ExecuteHttpWebRequestAndReturn 方法。

【讨论】:

    【解决方案2】:

    问题在于将模拟设置在错误的位置。我不得不将其移至另一种方法,以便更快地进行设置。

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      相关资源
      最近更新 更多