Unit testing 调用时Moq验证不匹配
在开始之前,我已经使用Moq在单元测试中模拟了很多年。这应该是一个简单的模拟验证,但无论出于何种原因,moq在发生时与模拟上的调用不匹配。我已经手动测试过了,它被击中了。我已经调试了测试并比较了实际值和预期值(它们匹配),我已经搜索了SO和它的许多人做了明显错误的事情,我不明白为什么这不起作用。谢谢你的帮助 单元测试是一个非常简单的测试,用于检查在Unit testing 调用时Moq验证不匹配,unit-testing,.net-core,moq,Unit Testing,.net Core,Moq,在开始之前,我已经使用Moq在单元测试中模拟了很多年。这应该是一个简单的模拟验证,但无论出于何种原因,moq在发生时与模拟上的调用不匹配。我已经手动测试过了,它被击中了。我已经调试了测试并比较了实际值和预期值(它们匹配),我已经搜索了SO和它的许多人做了明显错误的事情,我不明白为什么这不起作用。谢谢你的帮助 单元测试是一个非常简单的测试,用于检查在void返回函数末尾是否调用了BulkInsert。示例代码: 代码: 公共接口IDependencyService { 无效舱壁插入(IList项目
void
返回函数末尾是否调用了BulkInsert
。示例代码:
代码:
公共接口IDependencyService
{
无效舱壁插入(IList项目);
}
公共类MyServiceClass
{
私有只读IDependencyService _服务;
/*还有那些爵士乐*/
公开募捐
{
/*对数据做些什么*/
_service.BulkInsert(items);//其中items是IList
}
}
测试:
公共类服务测试
{
[事实]
public void servicerrun_Calls_DependencyBulkInsert()
{
var dependencyMock=new Mock();
列出预期值=/*以某种方式生成预期值*/
依附锁
.Setup(mock=>mock.BulkInsert(It.IsAny());
var sut=newmyserviceclass(dependencyMock.Object);
sut.Run();
Verify(mock=>mock.BulkInsert(预期),Times.Once());
}
}
错误消息:
Expected invocation on the mock once, but was 0 times: mock => mock.BulkInsert([ThresholdCheck])
Performed invocations:
Mock<IThresholdCheckHandler:1> (mock):
IThresholdCheckHandler.GetQueuedChecks()
IThresholdCheckHandler.BulkInsert([ThresholdCheck])
预期对mock调用一次,但为0次:mock=>mock.BulkInsert([ThresholdCheck])
执行的调用:
模拟(模拟):
IThresholdCheckHandler.GetQueuedChecks()的
IThresholdCheckHandler.BulkInsert([ThresholdCheck])
如果我在验证调用中将expected
更改为It.IsAny()
,则测试通过。这让我相信,从预期传递的对象可能与运行程序时生成的对象有所不同。然而,如上所述,我已经使用了调试器,并手动将实际列表中的每个值与测试中的预期值列表进行了比较,它们完全相同
这让我相信,我只是一只愚蠢的两足猴子,点击键盘,问题就在我面前,我只是看不见而已。感谢任何帮助或帮助。根据NKosi的评论,
验证
通过操作。使用引用类型时引用。我很困惑,因为我过去用Verify
来处理简单的事情,比如int和string,但我没有意识到这个怪癖。有人会假设它会检查实际值与预期值的等效性,但不会
不管怎样,根据Quercus的评论,为了继续我的一天,我调整了我的测试:
public class ServiceTests
{
[Fact]
public void ServiceRun_Calls_DependencyBulkInsert()
{
var dependencyMock = new Mock<IDependencyService>();
List<T> actual = new List<T>();
List<T> expected = /* somehow build expected values */
dependencyMock
.Setup(mock => mock.BulkInsert(It.IsAny<IList<T>>()))
.Callback<List<T>>(l => actual = l);
var sut = new MyServiceClass(dependencyMock.Object);
sut.Run();
actual.Should().BeEquivalentTo(expected);
}
}
公共类服务测试
{
[事实]
public void servicerrun_Calls_DependencyBulkInsert()
{
var dependencyMock=new Mock();
列表实际值=新列表();
列出预期值=/*以某种方式生成预期值*/
依附锁
.Setup(mock=>mock.BulkInsert(It.IsAny()))
.回调(l=>actual=l);
var sut=newmyserviceclass(dependencyMock.Object);
sut.Run();
实际的.Should().beequivalento(预期的);
}
}
这个解决方案对我有效。感谢你们两位帮助我认识到我的错误。除非预期的是传递给模拟成员的实际列表(引用),否则您描述的行为是经过设计的。好的,列表仅与自身相等,即使您的两个列表具有相同的元素,它们的“等于”将返回false。保留使用回调传递给mock方法的列表,然后将其与预期的进行比较。通过类似CollectionAssert.IsEqualAh的方式,好的,我不认为Verify是通过引用操作的,这很烦人。我真的不明白为什么它们会对引用而不是对象的相等性进行操作。感谢您的提醒,我将研究callback,因为您使用的是流畅的断言,您也可以在原始示例中执行
It.Is(actual=>actual.Should().beequivalento(expected))
Expected invocation on the mock once, but was 0 times: mock => mock.BulkInsert([ThresholdCheck])
Performed invocations:
Mock<IThresholdCheckHandler:1> (mock):
IThresholdCheckHandler.GetQueuedChecks()
IThresholdCheckHandler.BulkInsert([ThresholdCheck])
public class ServiceTests
{
[Fact]
public void ServiceRun_Calls_DependencyBulkInsert()
{
var dependencyMock = new Mock<IDependencyService>();
List<T> actual = new List<T>();
List<T> expected = /* somehow build expected values */
dependencyMock
.Setup(mock => mock.BulkInsert(It.IsAny<IList<T>>()))
.Callback<List<T>>(l => actual = l);
var sut = new MyServiceClass(dependencyMock.Object);
sut.Run();
actual.Should().BeEquivalentTo(expected);
}
}