多个单元测试通过与数据库的多个连接运行

时间:2018-11-19 10:30:44

标签: testing asp.net-core xunit

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

  

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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