【问题标题】:Moq: Test parameters sent with sequence of method calls起订量:随方法调用序列发送的测试参数
【发布时间】:2014-03-25 13:44:29
【问题描述】:

我是 C# Moq 的新手(过去使用过 Rhino Mochs)并且需要测试对同一方法的一系列调用。我发现这个很酷的解决方案可以测试一系列返回值:

http://haacked.com/archive/2009/09/29/moq-sequences.aspx/

public static class MoqExtensions
{
  public static void ReturnsInOrder<T, TResult>(this ISetup<T, TResult> setup, 
    params TResult[] results) where T : class  {
    setup.Returns(new Queue<TResult>(results).Dequeue);
  }
}

我需要做的是在对同一方法的一系列调用中测试作为方法参数发送的(而不是它返回的值)。

粗略的轮廓...

 var expression = new MyExpressionThing();

 processor.Setup(x => x.Execute(expected1)).Verifiable();
 processor.Setup(x => x.Execute(expected2)).Verifiable();
 processor.Setup(x => x.Execute(expected3)).Verifiable();

 expression.ExecuteWith(processor.Object);
 processor.Verify();

这是我尝试过的,但我遇到了异常:

“System.ArgumentException : 无效的回调。在带参数的方法上设置 (String,Object[]) 无法调用带参数的回调 (String)。”

 // Arrange
 var processor = new Mock<IMigrationProcessor>();
 IList<string> calls = new List<string>();
 processor.Setup(p => p.Execute(It.IsAny<string>()))
    .Callback<string>(s => calls.Add(s));

// Act
var expr = new ExecuteScriptsInDirectoryExpression { SqlScriptDirectory = @"SQL2\1_Pre" };
expr.ExecuteWith(processor.Object);

// Assert
calls.ToArray().ShouldBe(new[]
   { "DELETE FROM PRE1A", "DELETE FROM PRE1B", "INSERT INTO PRE2\r\nLINE2" });

看起来我正在使用起订量“入门”示例中的样板代码:

此链接讨论此异常并链接到触发它的最小起订量代码。

http://dailydevscoveries.blogspot.com.au/2011/04/invalid-callback-setup-on-method-with.html

【问题讨论】:

    标签: c# moq


    【解决方案1】:

    我会在每次调用 mock 时使用回调来捕获参数,然后断言结果:

    var parameters = new List<ParameterType>();
    processor.Setup(x => x.Execute(It.IsAny<ParameterType>()))
        .Callback<ParameterType>(param => parameters.Add(param));
    
    CallCodeUnderTest(processor.Object);
    
    Assert.That(parameters, Is.EqualTo(new[] { expected1, expected2, expected3 }));
    

    更新:根据您引用的错误消息,您正在模拟的方法似乎采用了第二个参数 params object[]。调用方法时不需要指定该参数(这就是为什么在 Setup lambda 中不需要它的原因),但您确实需要在泛型类型参数中指定它到 .Callback。将您的 Callback 行更改为:

        .Callback<string, object[]>((s, o) => calls.Add(s));
    

    【讨论】:

    • 是的。试过了。我收到“System.ArgumentException : Invalid callback. Setup on method with parameters (String,Object[]) cannot call callback with parameters (String).”
    • 查看编辑 -- 您可能需要调用 .Callback&lt;T&gt; 并指定类型参数,而不是依赖类型推断。
    • 是的。我正在这样做。请参阅上面显示我的确切代码的更新。
    • Ahhh ... 对不起,我没有给你完整的异常细节。 “System.ArgumentException:无效的回调。在带参数的方法上设置(字符串,对象 [])无法使用参数(字符串)调用回调。在 Moq.MethodCall.ThrowParameterMismatch(ParameterInfo [] 预期,ParameterInfo [] 实际)在 Moq.MethodCall .SetCallbackWithArguments(Delegate callback) at Moq.MethodCall.Callback(Action`1 callback)" 所以我怀疑我正在测试的代码抛出异常:)>
    • 不。不是这个。也许我正在运行不支持此功能的旧版 Moq。我正在破解一个可能有旧的 Moq 库的开源项目。
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多