【发布时间】:2019-08-07 16:54:37
【问题描述】:
我有一些将 Funcs 传递给某些方法的用例。我想要做的是使用 Moq 创建一个扩展或帮助程序,使我的测试能够轻松创建函数。这个助手的目标是
- 易于定义具有预期输入和固定输出的函数
- 如果未调用函数,测试应该失败
- 如果函数被错误的输入调用,测试应该会失败
- 使用
It.IsAny<TInput>()应该像在任何模拟中一样工作
我得到了我想要的大部分东西,但第 4 项却让我望而却步。这是我不明白的难以捉摸的失败测试的扩展和测试
public static Func<TIn, TOut> FixedFunc<TIn, TOut>(this MockRepository repo, TIn expectedInput, TOut fixedOutput)
{
var verifier = repo.Create<IInvokable<TIn, TOut>>(MockBehavior.Strict);
verifier.Setup(m => m.Invoke(expectedInput))
.Returns(fixedOutput);
return input => verifier.Object.Invoke(input);
}
public static Func<TIn, TOut> FixedFunc<TIn, TOut>(this MockRepository repo, TOut fixedOutput)
{
var verifier = repo.Create<IInvokable<TIn, TOut>>(MockBehavior.Strict);
verifier.Setup(m => m.Invoke(It.IsAny<TIn>()))
.Returns(fixedOutput);
return input => verifier.Object.Invoke(input);
}
public interface IInvokable<TIn, TOut>
{
TOut Invoke(TIn input);
}
这里是测试
[Fact] // succeeds
public void MockFunc_SameObject_RetursResult()
{
var expectedInput= new object();
var expectedOutput = 2;
var repo = new MockRepository(MockBehavior.Strict);
var function = repo.FixedFunc(exptecedInput, expectedOutput);
var output = function(expectedInput);
Assert.Equal(expectedOutput, output);
repo.VerifyAll();
}
[Fact]
// Fails with the following exception:
// "Moq.MockException: IInvokable`2.Invoke(object) invocation failed with mock behavior Strict.
// All invocations on the mock must have a corresponding setup."
public void MockFunc_IsAny_RetursResult()
{
var exptecedInput = new object();
var expectedOutput = 2;
var repo = new MockRepository(MockBehavior.Strict);
var function = repo.FixedFunc(It.IsAny<object>(), expectedOutput);
var output = function(exptecedInput);
Assert.Equal(expectedOutput, output);
repo.VerifyAll();
}
[Fact] // succeeds
public void MockFunc_WithAny_RetursResult()
{
var expectedOutput = 2;
var repo = new MockRepository(MockBehavior.Strict);
var function = repo.FixedFunc<object, int>(expectedOutput);
var output = function(new object());
Assert.Equal(expectedOutput, output);
repo.VerifyAll();
}
我不明白如何使用 It.IsAny 对 FixedFunc<TOut> 有效,但对 FixedFunc<TIn, TOut 无效>
【问题讨论】: