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的存储库

参考文献