c# - 在 transactionScope 中使用客户端测试 WebAPI?

标签 c# asp.net asp.net-mvc automated-tests restsharp

问题

有什么方法可以为事务范围指定一个连接,以便可以回滚这种“脱离上下文”测试的影响吗?

背景

我正在使用 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/

相关文章:

c# - Entity Framework - 延迟加载或额外的异步/等待查询方法?

.net - 创建一个实现 ILiquidizable 的 DataRow 类

c# - CS0103 : The name 'CType' does not exist in the current context

ASP.NET MVC : When should I create custom View Engine

c# - 在表单之间传递数据(事件未触发)

c# - 在 ReadToEnd 之后关闭 StreamReader

ASP.net 页面在导入语句上出现错误,但我确实有适当的引用?

c# - 从 Javascript 调用 MVC Controller 时为空值

c# - Foreach 同时将项目添加到循环集合

c# - 需要帮助为Where子句创建表达式树