首页 > 解决方案 > 多个单元测试在多个数据库连接的情况下运行

问题描述

在 Asp.Net core 项目中,有几个单元测试使用服务来连接数据库并带来真实数据,因此创建了多个并发连接。当这些测试运行时,我收到了这个错误

在前一个操作完成之前,在此上下文上开始了第二个操作。不保证任何实例成员都是线程安全的。

但我不知道如何在不使用异步方式的情况下修复此错误。

标签: testingasp.net-corexunit

解决方案


在单元测试中,您不应使用与数据库的连接。您应该使用模型并创建自己的数据进行测试。

使用 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);
    }

在上面的示例中,我手动设置了模型数据库的值,服务方法将使用它来检索帐户并将返回的电子邮件与给定的电子邮件进行比较。


推荐阅读