C# 如何运行mstest单元测试,以便底层数据库有时间正确构建?

C# 如何运行mstest单元测试,以便底层数据库有时间正确构建?,c#,sql-server,visual-studio,unit-testing,mstest,C#,Sql Server,Visual Studio,Unit Testing,Mstest,我有一个C#库,我为它编写了很多单元测试。该库是一个数据访问层库,需要SQL Server的全文索引功能,这意味着LocalDb将无法工作。单元测试正在连接到本地SQL Server实例。该项目有一个IDatabaseInitializer,它为每个测试删除并重新创建数据库,因此每个测试都有一组新的数据来假设它可以工作,这意味着每个测试都能够独立运行-无需排序 从第一天开始,我就遇到了一个问题,但还没有解决,那就是如果我只是一次运行所有的测试,有些会失败。如果我回去单独运行这些测试,它们就会成功

我有一个C#库,我为它编写了很多单元测试。该库是一个数据访问层库,需要SQL Server的全文索引功能,这意味着LocalDb将无法工作。单元测试正在连接到本地SQL Server实例。该项目有一个
IDatabaseInitializer
,它为每个测试删除并重新创建数据库,因此每个测试都有一组新的数据来假设它可以工作,这意味着每个测试都能够独立运行-无需排序

从第一天开始,我就遇到了一个问题,但还没有解决,那就是如果我只是一次运行所有的测试,有些会失败。如果我回去单独运行这些测试,它们就会成功。当我同时运行所有测试时,失败的测试并不总是相同的

我假设这是因为它们都在同一个数据库上运行得如此之快。在下一次测试运行之前,可能数据库没有正确地删除和重新创建。除了一个简单的数据库之外,我还有一个SQL Server全文索引,我的一些测试需要它才能通过。全文索引是在后台填充的,因此在填充测试数据库的表后不会立即“准备就绪”。构建全文索引可能需要一两秒钟的时间。这会导致以全文索引为目标的测试总是失败,除非我在调试程序中逐步完成初始值设定项,并在全文索引生成时暂停几秒钟


我的问题是,有没有办法避免数据库重建的冲突?作为奖励,是否有办法“减缓”需要全文索引的测试,以便它有时间填充?

您可以使用具有固定数据的数据库。对于您的测试,您使用从TestInitialize开始的事务,并在TestCleanup上回滚

如果您的单元测试连接到数据库,则它们不是单元测试。-模拟数据库并根据内存中的值运行代码。。。这样你就根本不需要等待数据库了。“什么时候测试不是测试”——这看起来是个糟糕的主意。这些测试运行运行SQL之类的代码。如果我们模拟数据库,这不是假设SQL是正确的吗?我觉得模拟db会产生很多假设,这些假设是测试直接试图消除的?我不是说你错了,我在考虑你的建议。嘲弄db似乎没什么用。一个坏主意?真正地您应该单独测试代码。如果数据库连接中断怎么办?是否有人更改数据库中的值?现在可能有无数种与代码本身无关的方式使测试失败。糟糕的测试。。。。不仅如此,你现在也遇到了问题。。。速度您已经检测到设计气味!如果我是你,我会想办法把数据访问与代码隔离开来。。。可能是在存储库层后面,所以我想回答诸如“我的数据库全文索引是否按预期与我的库一起工作”之类的问题不是单元测试的工作。也许更像是集成测试?