gpt4 book ai didi

c# - 最小起订量:随方法调用顺序发送的测试参数

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:28 25 4
gpt4 key购买 nike

我是 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" });

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

此链接讨论了此异常并链接到触发它的 Moq 代码。

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

最佳答案

我会在每次调用 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<string, object[]>((s, o) => calls.Add(s));

关于c# - 最小起订量:随方法调用顺序发送的测试参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21978561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com