繁体   English   中英

设置和验证中具有相同参数的最小起订量

[英]Moq with same argument in Setup and Verify

通常,我在SetupVerify编写相同的参数表达式。 有没有办法参考它们?


我写的是:

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);

然后,我有了一个想法,因为SetupVerify共享相同的参数,因此应该/应该将其移动到通用引用中,如下所示:

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那么调用将在调用时被捕获。 但这只是一个展示柜,不应该经常发生:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM