【问题标题】:Unit test project - NUnit reference, throw exception单元测试项目——NUnit参考,抛出异常
【发布时间】:2021-03-03 14:39:46
【问题描述】:

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

[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.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-testing nunit


【解决方案1】:

设置模拟以返回 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多