В этом случае вы можете использовать Verifiable
, тогда вам вообще не нужно указывать параметры в Verify
. Он проверит, что конкретный проверяемый Setup
был вызван.
var mock = new Moq<IFoo>();
mock.Setup(m => m.MyMethod(It.Is.Any<string>()).Verifiable();
...
mock.Verify();
IMO Verifiable
- лучший выбор, так как Verify(Expression<>)
не работает с настройками, но вызывает внутренне. Объяснение ниже:
public class Example
{
public bool IsValid { get; set; }
}
public interface IExample
{
bool Do(Example e);
}
// arrange
Expression<Func<IExample, bool>> expr = m => m.Do(It.Is<Example>(x => x.IsValid));
var mock = new Mock<IExample>();
mock.Setup(expr).Verifiable();
// act
var example = new Example {IsValid = true};
mock.Object.Do(example);
example.IsValid = false;
// assert
mock.Verify(expr, Times.Once);
Каким будет результат? Тест не удастся , поскольку Verify
будет вычислять выражение после изменения объекта. Если вы используете Verify
, то вызов будет перехвачен в момент вызова. Однако это просто витрина, не должно случаться так часто:)