我有一个这样定义的设置
Mock<IDeclarationQuery> _declarationQueryMock = new Mock<IDeclarationQuery>();
_declarationQueryMock.Setup(x => x.FindDeclarationDetailAsync(It.IsAny<FindDeclarationModel>(), cancellationToken))
.ReturnsAsync(declarationDetailResponse);
而且效果非常好。当测试尝试运行此方法时,我得到
declarationDetailResponse
。
在此设置中,我使用
FindDeclarationModel
将 It.IsAny<FindDeclarationModel>()
的随机对象传递给参数。
然后我想把它说得更具体。因此,我尝试将实际参数传递给测试在运行时实际要获取的设置中的方法。所以我尝试了这个
FindDeclarationModel findDeclarationModel = new FindDeclarationModel()
{
CountryCode = "AFG",
DeclarationTypeId = DeclarationTypes.ADPA,
Year = 2022
};
_declarationQueryMock.Setup(x => x.FindDeclarationDetailAsync(findDeclarationModel, cancellationToken))
.ReturnsAsync(declarationDetailResponse);
但随后它就停止工作了。
从停止工作我的意思是,当测试运行时,
FindDeclarationDetailAsync
然后开始返回null
。
虽然我确保甚至在调试期间检查了该方法是使用与我在设置中传递的
FindDeclarationModel
完全相同的结构和值对象来调用的,但它仍然停止工作。
我做错了什么还是根本不可能?
它是否试图通过引用来匹配实际对象和设置对象并因此考虑它们的不同?
在您的设置中,您期望任何类型的对象
FindDeclarationModel
:
_declarationQuery.Setup(x => x.FindDeclarationDetailAsync(It.IsAny<FindDeclarationModel>(), cancellationToken))
.ReturnsAsync(declarationDetailResponse);
Moq 通过引用比较对象,这意味着您可能无法传递
FindDeclarationModel
的确切实例。
您可能会将
FindDeclarationModel
映射到您测试的方法内部,但没有像此方法中那样通过它。
作为快速解决方案,您可以使用下一个设置:
_declarationQuery.Setup(x => x.FindDeclarationDetailAsync(
It.Is<FindDeclarationModel>(f => f.CountryCode == findDeclarationModel.CountryCode &&
f.DeclarationTypeId == findDeclarationModel.DeclarationTypeId &&
f.Year == findDeclarationModel.Year),
cancellationToken))
.ReturnsAsync(declarationDetailResponse);
您还可以使用
.Callback
: 进行比较
_declarationQuery.Setup(x => x.FindDeclarationDetailAsync(
It.IsAny<FindDeclarationModel>(),
cancellationToken))
.Callback((FindDeclarationModel model, CancellationToken token) =>
{
// you can get access to model here for comparing
})
.ReturnsAsync(declarationDetailResponse);