gpt4 book ai didi

c# - Moq - 在传递参数时使用 It.Is<> 与不使用它

转载 作者:行者123 更新时间:2023-11-30 21:49:53 28 4
gpt4 key购买 nike

在哪些情况下,在将参数传递给 Moq 设置时使用 It.Is<> 语法至关重要,而不是单独检索此类参数的值,然后以“普通”方式传递它?到目前为止,我的测试需求可能是有限的,但我没有遇到使用 It.Is<> 的需要,它不能在 mock.Setup 之外定义? It.Is<> 在我查看资源时看起来很受欢迎,对于这样的基本示例也是如此,所以我想知道有什么优势。为了简洁起见,下面是一个简单的示例,但对于我遇到的其他情况也没有任何区别。我的意思是:

mockRepo.Setup(m =>m.GetAllReadingsOn
(latestDate)
.Returns(_filteredReadings);

对比

mockRepo.Setup(m => m.GetAllReadingsOn
(It.Is<DateTime>(d => d ==_latestDate)))
.Returns(_filteredReadings);

最佳答案

我总是会使用第一种方法,因为它更短。有一个异常(exception):无法比较的引用类型,因为被测试的方法创建了它们。在这种情况下,您将需要逐个比较属性以确保方法创建并传递了正确的引用类型:

mockRepo.Setup(m => m.GetAllReadingsOn(It.Is<SomeComplexObject>(x => 
x.Foo == "foo" &&
x.Bar == "bar" &&
x.Baz == 123)))
.Returns(_filteredReadings);

有人说,将这种方法用于 DateTimes 等值类型完全是浪费击键。


根据评论部分的要求,这是第一种方法不起作用时的基本示例。假设我们要测试以下方法:

public SomeResult FooBarBaz()
{
var myModel = new SomeComplexObject();
myModel.Foo = "foo";
myModel.Bar = "bar";
myModel.Baz = 123;
var result = repository.GetTheResult(myModel);

return result;
}

很明显,如果您尝试编写以下测试,它将惨遭失败:

// arrange
var sut = new Sut();
var myModel = new SomeComplexObject();
myModel.Foo = "foo";
myModel.Bar = "bar";
myModel.Baz = 123;
var expected = new SomeResult();
mockRepo
.Setup(m => m.GetAllReadingsOn(myModel)
.Returns(expected);

// act
var actual = sut.FooBarBaz();

// assert
Assert.AreEqual(expected, actual);

关于c# - Moq - 在传递参数时使用 It.Is<> 与不使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675203/

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