问题
有什么方法可以为事务范围指定一个连接,以便可以回滚这种“脱离上下文”测试的影响吗?
背景
我正在使用 RestSharp 来测试 WebAPI Controller 。这是一个集成测试,通过向 API 发送请求进行测试,API 通过存储库和服务层一直向下传播到数据层。换句话说,这不是一个单元测试。
测试创建了一个 restClient 实例:
[TestInitialize()]
public virtual void TestInitialize()
{
_client = new RestClient("http://localhost:24144");
_client.CookieContainer = new System.Net.CookieContainer();
}
然后客户端发出一些请求,完全不知道数据上下文(再次,有意):
// pseudocode
_client.DoThis();
_client.DoThat();
此测试针对从 EF 代码优先迁移生成的测试数据库运行。我有一个空的种子方法,所以数据库是空的:
protected override void Seed(TestAppDbContext context)
{
SqlConnection.ClearAllPools();
context.Database.Delete();
context.Database.CreateIfNotExists();
}
问题
这只是我想运行的众多测试之一。目前我必须在测试之间删除/重新创建数据库并确保 Api 测试在其他测试之后运行。因为它对数据上下文一无所知,所以我不能(或无法弄清楚如何)将所有测试代码包装在事务中以进行回滚。
我尝试过的
- 在 TestInitialize 中新建一个事务范围并在 TestCleanup 中处理它。这没有任何作用。
- 在此测试后运行“更新数据库”只是为了好玩 - 但尽管我调用了 ClearAllPools(),但我总是得到“无法删除数据库,因为它当前正在使用中”。这不是我想关注但认为值得一提的问题。
最佳答案
几个月前我遇到了类似的问题,但出于与您陈述的许多相同的原因,我没有想出使用 TransactionScope
的好的解决方案。
我结束了 self hosting测试项目中的 WebAPI。并使用可以在每次测试运行之前删除和重新创建(和迁移)的 SQLCE 4 数据库。这已经启动并运行了一段时间并且运行良好。
关于c# - 在 transactionScope 中使用客户端测试 WebAPI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388595/