У меня есть несколько случаев использования, когда я передаю 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
>