testing - 多个单元测试在多个数据库连接的情况下运行
问题描述
在 Asp.Net core 项目中,有几个单元测试使用服务来连接数据库并带来真实数据,因此创建了多个并发连接。当这些测试运行时,我收到了这个错误
在前一个操作完成之前,在此上下文上开始了第二个操作。不保证任何实例成员都是线程安全的。
但我不知道如何在不使用异步方式的情况下修复此错误。
解决方案
在单元测试中,您不应使用与数据库的连接。您应该使用模型并创建自己的数据进行测试。
使用 NuGet 包moq
轻松创建模型对象。
使用模型对象的示例:
public void Test_Login()
{
Mock<IDatabase> mockDatabase = new Mock<IDatabase>();
mockDatabase.Setup(p => p.GetAccountAsync(It.IsAny<string>()))
.Returns((string givenEmail) => Task.FromResult(new Account(1, "test", givenEmail, "123", "$2b$10$pfsnDQ3IWuY/zER/uBQpedvRFntMNHGOGhOSpABKZ7bwS", false)));
Mock<IConfiguration> mockConfiguration = new Mock<IConfiguration>();
Mock<IHostingEnvironment> mockHostingEnvironment = new Mock<IHostingEnvironment>();
AccountService accountService = new AccountService(mockDatabase.Object, mockConfiguration.Object, mockHostingEnvironment.Object);
LoginViewModel loginViewModel = new LoginViewModel
{
EmailLogin = "test@test.com",
PasswordLogin = "s"
};
Task<Account> account = accountService.LoginAsync(loginViewModel);
Assert.NotNull(account.Result);
Assert.Equal(loginViewModel.EmailLogin, account.Result.Email);
}
在上面的示例中,我手动设置了模型数据库的值,服务方法将使用它来检索帐户并将返回的电子邮件与给定的电子邮件进行比较。
推荐阅读
- html - 如何指定我们的复选框的值
- arrays - 为什么我的数组声称是一个对象?
- arrays - 使用数组跟踪机器人图像的正确方法是什么?
- postgresql - 在 CakePHP 中处理分区表
- r - 为嵌套列表中的每条记录绘制回归线
- react-native - 'fetch' 未定义.eslint(no-undef) 在 react-native
- cordova - 使用 Cordova FCM 构建失败 + 原因:Dex 无法解析版本 52 字节代码
- python - 如果在Django ORM中使用group by没有特定年份的值,如何获取列表中的所有值并按年份分组并将0放在列表中?
- angular - 需要在 Observable 订阅中使用超时来获取准确的数据
- react-native - 在 React Native 应用程序和 Expo 中使用 Google Maps 等原生模块