C# 如何为单元测试模拟服务中的存储库方法
我尝试对我的服务进行单元测试,我模拟了所需的一切,我如何模拟服务正在调用的存储库方法,以使其具有价值且代码不会中断 这是我的单元测试:C# 如何为单元测试模拟服务中的存储库方法,c#,unit-testing,C#,Unit Testing,我尝试对我的服务进行单元测试,我模拟了所需的一切,我如何模拟服务正在调用的存储库方法,以使其具有价值且代码不会中断 这是我的单元测试: public async Task Updateuser_ReturnsResponse() { // Arrange var request = new UpdateUserRequest() { Guid = new Guid("92296ac1-f8e1-489a
public async Task Updateuser_ReturnsResponse()
{
// Arrange
var request = new UpdateUserRequest()
{
Guid = new Guid("92296ac1-f8e1-489a-a312-6ea9d31d60f8"),
FirstName = "TestFirst",
LastName = "TestLast",
PhoneWork = "9495467845",
EmailWork = "test123@yahoo.com",
};
var respose = new UpdateUserResponse()
{
Success = true
};
var getGuidRequest = new GetGuidRequest()
{
Guid = request.Guid
};
var getGuidResponse = new GetGuidResponse()
{
Guid = request.Guid
};
var mockUserRepository = new Mock<IUserRepository>();
var mockAwsProxy = new Mock<IAwsProxy>();
mockUserRepository.Setup(s => s.UpdateUserAsync(request)).ReturnsAsync(respose);
mockUserRepository.Setup(i => i.GetGuidAsync(getGuidRequest)).ReturnsAsync(getGuidResponse);
var sut = new FromService.UserService(....);
// Act
var response = await sut.UpdateUserAsync(request);
// Assert
Assert.NotNull(response);
Assert.True(response.Success);
}
public async Task Updateuser_ReturnsResponse()
{
//安排
var request=new UpdateUserRequest()
{
Guid=新Guid(“92296ac1-f8e1-489a-a312-6ea9d31d60f8”),
FirstName=“TestFirst”,
LastName=“TestLast”,
PhoneWork=“9495467845”,
电子邮件工作=”test123@yahoo.com",
};
var respose=new UpdateUserResponse()
{
成功=正确
};
var getGuidRequest=new getGuidRequest()
{
Guid=请求。Guid
};
var getGuidResponse=new getGuidResponse()
{
Guid=请求。Guid
};
var mockUserRepository=new Mock();
var mockAwsProxy=new Mock();
mockUserRepository.Setup(s=>s.UpdateUserAsync(请求)).ReturnsAsync(响应);
mockUserRepository.Setup(i=>i.GetGuidAsync(getGuidRequest)).ReturnsAsync(getGuidResponse);
var sut=new FromService.UserService(..);
//表演
var response=wait sut.UpdateUserAsync(请求);
//断言
Assert.NotNull(响应);
Assert.True(response.Success);
}
我的问题是调用-var response=wait sut.UpdateUserAsync(请求)时;它转到服务,并且此GuidResponse为空,因此它在显示GuidResponse Null后中断:
public async Task<UpdateUserResponse> UpdateUserAsync(UpdateUserRequest request)
{
if (request.EmailWork.HasValue() || request.Role.HasValue())
{
var GuidResponse = await userRepository.GetGuidAsync(new GetGuidRequest
{
Guid = request.Guid
});
// it breaks here because GuidResponse is Null.
if (GuidResponse.Guid != null && request.EmailWork.HasValue())
{
.......
public异步任务updateUserSync(UpdateUserRequest请求)
{
if(request.EmailWork.HasValue()| | request.Role.HasValue())
{
var GuidResponse=await userRepository.GetGuidAsync(新GetGuidRequest
{
Guid=请求。Guid
});
//它在这里中断,因为GuidResponse为Null。
if(GuidResponse.Guid!=null&&request.EmailWork.HasValue())
{
.......
它失败,因为设置与执行测试时实际提供给模拟的内容不匹配
使用It.Is()
匹配传递的参数
//...omitted for brevity
mockUserRepository
.Setup(_ => _.GetGuidAsync(It.Is<GetGuidRequest>(x => x.Guid == request.Guid)))
.ReturnsAsync(getGuidResponse);
//...omitted for brevity
//…为简洁起见省略
mockUserRepository
.Setup(=>u.GetGuidAsync(It.Is(x=>x.Guid==request.Guid)))
.ReturnsAsync(getGuidResponse);
//…为简洁起见省略
假设模拟存储库就是注入SUT的存储库
参考文献