在设置和验证中具有相同参数的最小起订量
Moq with same argument in Setup and Verify
我经常在 Setup
和 Verify
中写相同的参数表达式。有没有办法引用它们?
我写的:
var mock = new Moq<IFoo>();
mock.Setup(m => m.MyMethod(It.Is.Any<string>());
...
mock.Verify(m => m.MyMethod(It.Is.Any<string>()), Times.Once);
然后我想到,由于 Setup
和 Verify
共享相同的参数,因此 should/could 被移动到一个公共引用中,如下所示:
var MyMethodCall = {WHAT SHOUD BE HERE?};
var mock = new Moq<IFoo>();
mock.Setup(m => MyMethodCall);
...
mock.Verify(m => MyMethodCall, Times.Once);
您可以创建一个保存表达式的变量,以便重复使用它:
Expression<Action<IFoo>> expression = x => x.MyMethod(It.Is.Any<string>());
var mock = new Moq<IFoo>();
mock.Setup(expression);
...
mock.Verify(expression, Times.Once);
在这种情况下,您可以使用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
,那么调用将在调用时被捕获。然而,这只是一个展示,不应该经常发生:)
我经常在 Setup
和 Verify
中写相同的参数表达式。有没有办法引用它们?
我写的:
var mock = new Moq<IFoo>();
mock.Setup(m => m.MyMethod(It.Is.Any<string>());
...
mock.Verify(m => m.MyMethod(It.Is.Any<string>()), Times.Once);
然后我想到,由于 Setup
和 Verify
共享相同的参数,因此 should/could 被移动到一个公共引用中,如下所示:
var MyMethodCall = {WHAT SHOUD BE HERE?};
var mock = new Moq<IFoo>();
mock.Setup(m => MyMethodCall);
...
mock.Verify(m => MyMethodCall, Times.Once);
您可以创建一个保存表达式的变量,以便重复使用它:
Expression<Action<IFoo>> expression = x => x.MyMethod(It.Is.Any<string>());
var mock = new Moq<IFoo>();
mock.Setup(expression);
...
mock.Verify(expression, Times.Once);
在这种情况下,您可以使用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
,那么调用将在调用时被捕获。然而,这只是一个展示,不应该经常发生:)