Moq - 在传递参数时使用 It.Is<> 与不使用它
Moq - using It.Is<> when passing parameters vs not using it
在这种情况下,在将参数传递给 Moq 设置时使用 It.Is<> 语法至关重要,而不是单独检索此类参数的值,然后以 "plain" 方式传递它?到目前为止,我的测试需求可能是有限的,但我没有遇到使用无法在 mock.Setup 之外定义的 It.Is<> 的需要? It.Is<> 在我查看资源时看起来很受欢迎,对于这样的基本示例也是如此,所以我想知道有什么优势。为了简洁起见,下面是一个简单的示例,但对于我遇到的其他情况也没有任何区别。我的意思是:
mockRepo.Setup(m =>m.GetAllReadingsOn
(latestDate)
.Returns(_filteredReadings);
对比
mockRepo.Setup(m => m.GetAllReadingsOn
(It.Is<DateTime>(d => d ==_latestDate)))
.Returns(_filteredReadings);
我总是会使用第一种方法,因为它更短。有一个例外:无法比较的引用类型,因为被测试的方法创建了它们。在这种情况下,您需要将 属性 与 属性 进行比较,以确保该方法创建并传递了正确的引用类型:
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);
在这种情况下,在将参数传递给 Moq 设置时使用 It.Is<> 语法至关重要,而不是单独检索此类参数的值,然后以 "plain" 方式传递它?到目前为止,我的测试需求可能是有限的,但我没有遇到使用无法在 mock.Setup 之外定义的 It.Is<> 的需要? It.Is<> 在我查看资源时看起来很受欢迎,对于这样的基本示例也是如此,所以我想知道有什么优势。为了简洁起见,下面是一个简单的示例,但对于我遇到的其他情况也没有任何区别。我的意思是:
mockRepo.Setup(m =>m.GetAllReadingsOn
(latestDate)
.Returns(_filteredReadings);
对比
mockRepo.Setup(m => m.GetAllReadingsOn
(It.Is<DateTime>(d => d ==_latestDate)))
.Returns(_filteredReadings);
我总是会使用第一种方法,因为它更短。有一个例外:无法比较的引用类型,因为被测试的方法创建了它们。在这种情况下,您需要将 属性 与 属性 进行比较,以确保该方法创建并传递了正确的引用类型:
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);