Я использую Moq и хочу создавать классы-конструкторы для создания мотов с предустановленными разумными значениями по умолчанию, которые могут быть переопределены при настройке теста по мере необходимости. Подход, который я использовал, использует методы расширения, в которых я передаю значения входных параметров и ожидаемый результат. При этом я вижу различное поведение в том, что кажется мне семантически эквивалентным кодом: передача It.IsAny() непосредственно в настройке и передача значения It.IsAny() косвенно в настройке. Пример:
public interface IFoo
{
bool Bar(int value);
bool Bar2(int value);
}
public class Foo : IFoo
{
public bool Bar(int value) { return false; }
public bool Bar2(int value) { return false; }
}
var mock = new Mock<IFoo>();
mock.Setup(x => x.Bar(It.IsAny<int>())).Returns(true);
Assert.IsTrue(mock.Object.Bar(123)); // Succeeds
var myValue = It.IsAny<int>();
mock.Setup(x => x.Bar2(myValue)).Returns(true);
Assert.IsTrue(mock.Object.Bar2(123)); // Fails
Оба вызова эквивалентны (мне), но вызов Bar2 не дает подтверждения. Почему это?