c# - 单元测试项目——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");
}
在这个测试中,我想检查用户何时存在抛出我定义的异常,但我有问题。
当我调用 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);
解决方案
设置模拟以返回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);
}
推荐阅读
- php - 需要自动分页帮助
- pki - 我可以使用 openssl cli 工具生成 SCEP 请求消息吗?
- java - 我如何传递一个列表
到 mvc.perform 内容 - git - 尝试使用 git filter repo 减少 repo 大小
- sql - 根据文件类型导出 Blob
- html - 如何将页脚保持在页面底部?
- mysql - 有人能解释一下为什么这些查询有不同的执行时间吗?
- html - 如何仅将 flex-direction 应用于 flex 容器内的某些元素?
- pgrouting - pgRouting 与自定义网络?
- here-api - 这里 api 显示具有相同起点和终点但通过附加航点的路线的交通时间更小