问题
有没有办法为事务范围指定一个连接,以便可以回滚这个“上下文外”测试的效果?
背景
我正在使用 RestSharp 来测试 WebAPI 控制器。这是一个集成测试,通过向 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 中处理。这无济于事。
- 在这个测试之后运行'update-database'只是为了好玩-但我总是得到'不能删除数据库,因为它当前正在使用',尽管我调用了ClearAllPools()。这不是我想关注的问题,但认为值得一提。