首页 > 解决方案 > 单元测试项目——NUnit参考,抛出异常

问题描述

我有单元测试项目,我写了一个测试来检查一个功能:

[Test]
    public async Task should_not_be_able_register_user_when_user_with_given_name_already_exists()
    {
        var mockUserRepository = new Mock<IUserRepository>();

        var userService = new UserService(mockUserRepository.Object);

        mockUserRepository.Setup(x => x.AddAsync(user));
        await userService.RegisterAsync("user", "userLastName", "fakeuser", "user@example.com", "123456789");
    }

在这个测试中,我想检查用户何时存在抛出我定义的异常,但我有问题。

  1. 当我调用 await userService.RegisterAsync... 如何写 assert ?

    Assert.Throws(() => 这里应该有什么?

我的代码:RegisterAsync 看起来像:

public async Task RegisterAsync(string firstName, string lastName, string username, string email, string phoneNumber)
    {
        var user = await _userRepository.GetAsync(username);

        if (user != null)
        {
            throw new CoreException(ErrorCode.UsernameExist, $"Username {user.Username} already exist.");
        }

        user = new User(firstName, lastName, username, email, phoneNumber);
        await _userRepository.AddAsync(user);
    }

获取异步:

public async Task<User> GetAsync(string username)
        => await _context.Users.SingleOrDefaultAsync(x => x.Username == username);

标签: c#unit-testingnunit

解决方案


设置模拟以返回User

//...

User user = new User("firstName", "lastName", "username", "email", "phoneNumber");
mockUserRepository
    .Setup(x => x.GetAsync(It.IsAny<string>()))
    .ReturnsAsync(() => user);


//...

以便

if (user != null)
{
    throw new CoreException(ErrorCode.UsernameExist, $"Username {user.Username} already exist.");
}

将导致主题代码抛出预期的错误并断言。

这都可以概括为

[Test]
public async Task should_not_be_able_register_user_when_user_with_given_name_already_exists() {
    //Arrange
    var mockUserRepository = new Mock<IUserRepository>();

    var userService = new UserService(mockUserRepository.Object);

    User user = new User("firstName", "lastName", "username", "email", "phoneNumber");
    mockUserRepository
        .Setup(x => x.GetAsync(It.IsAny<string>()))
        .ReturnsAsync(() => user);

    //Act
    Func<Task> act = userService.RegisterAsync("user", "userLastName", "fakeuser", "user@example.com", "123456789");

    //Assert
    CoreException exception = await Assert.ThrowsAsync<CoreException>(act);
}

推荐阅读