gpt4 book ai didi

testing - 最小起订量 - 是否可以在设置中指定验证标准(例如调用次数)?

转载 作者:行者123 更新时间:2023-11-28 19:38:46 27 4
gpt4 key购买 nike

如果您需要设置一个返回值,以及验证表达式被调用了多少次,您可以在一条语句中完成吗?

据我所知,Moq 的 Setup(SomeExpression).Verifiable()Verify() 一起调用,基本上执行 Verify(SomeExpression, Times .AtLeastOnce)?即它验证表达式仅被调用。

这里有一个例子可以更好地解释这个问题。对于接口(interface):

interface IFoo
{
int ReturnSomething();
}

以下两个 block 是否等效(除了第一个将验证所有设置标记为可验证)?

void Test()
{
var mock = new Mock<IFoo>();
mock.Setup((m) => m.ReturnSomething()).Returns(1).Verifiable();

mock.Verify();
}

void Test()
{
var mock = new Mock<IFoo>();
mock.Setup((m) => m.ReturnSomething()).Returns(1);

mock.Verify((m) => m.ReturnSomething(), Times.AtLeastOnce());
}

如果我想验证调用次数(比如两次),这是唯一的方法吗?在设置和验证中重复表达式?

void Test()
{
var mock = new Mock<IFoo>();
mock.Setup((m) => m.ReturnSomething()).Returns(1);

mock.Verify((m) => m.ReturnSomething(), Times.Exactly(2));
}

我只是不喜欢调用设置和验证。好吧,因为这对 AAA 来说是个好主意,换句话说,我不喜欢重复设置和验证的表达式。目前我将表达式存储在一个变量中并将其传递给每个方法,但感觉不太干净。

PS - 此上下文用于测试检查缓存何时更新(过期等)

最佳答案

我一直有这个问题。我使用严格模拟,我想严格指定(即我使用 It.Is<>() 而不是 It.IsAny() )以及严格验证(即指定时间)。遗憾的是,您不能为此使用可验证的,因为最小起订量缺少 Verifiable(Times)过载。

调用的完整表达式,包括It.Is<>()一般都很大。因此,为了避免重复,我通常采用以下方法:

Expression<Action<MockedType>> expression = mockedTypeInstance => mockedTypeInstance.MockedMethod(It.Is<TFirstArgument>(firstArgument => <some complex statement>)/*, ...*/);
_mock.Setup(expression);

/* run the test*/

_mock.Verify(expression, Times.Once);

不是非常可读,但我认为没有另一种方法可以同时使用严格设置和严格验证。

关于testing - 最小起订量 - 是否可以在设置中指定验证标准(例如调用次数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360685/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com