gpt4 book ai didi

c# - 模拟函数

转载 作者:行者123 更新时间:2023-11-28 20:48:49 26 4
gpt4 key购买 nike

我有一些用例,我将 Funcs 传递给某些方法。我想要做的是使用 Moq 创建一个扩展或帮助器,使我的测试能够轻松创建函数。这个助手的目标是

  1. 易于定义具有预期输入和固定输出的函数
  2. 如果未调用函数,测试应该失败
  3. 如果使用错误的输入调用函数,测试应该失败
  4. 使用 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 >

最佳答案

注意一件事,如果你评估It.Any<object>()结果将是 null .在 Func<TIn, TOut> 的情况下您正在有效地为以下方面创 build 置:

verifier.Setup(m => m.Invoke(null)).Returns(fixedOutput);

然后用 var exptecedInput = new object(); 调用它.在VerifyAll期间什么时候moq尝试评估和匹配它不能这样做的参数,因为 null != new object() .


您也可以使用 It.Any<object>() 调用方法或者重新设计一个扩展来传递 Expression并使用 Expression 注册设置而不是特定的对象。

[Fact] // This will pass
public void MockFunc_IsAny_RetursResult()
{
var expectedOutput = 2;

var repo = new MockRepository(MockBehavior.Strict);
var function = repo.FixedFunc(It.IsAny<object>(), expectedOutput);

var output = function(It.IsAny<object>());

Assert.Equal(expectedOutput, output);
repo.VerifyAll();
}

关于c# - 模拟函数<Tin,Tout>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202445/

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