有时测试失败并显示消息ExecuteReader需要一个开放且可用的连接。连接的当前状态已关闭

时间:2015-07-06 19:09:33

标签: c#

我的单元测试失败并显示消息: ExecuteReader需要一个开放且可用的连接。当所有单元测试都运行时,连接的当前状态已关闭,但在单独运行时成功。 他们都失败的地方看起来像这样:

public void Handle()
{
   using (ConnectionManager.Open())
   {
      var result = Query().ToList();
   }
}

查询看起来像这样:

public IEnumerable<Thing> Query()
{
  // Create parameters and stored proc name ...

  return Connection.Query(storedProcedureName, parameters);
}   

单步执行代码显示Connection在输入查询之前已打开,但在输入时已关闭。但是,当单独运行时,连接将保持打开状态,直到使用结束并成功。 我不知道为什么会这样。我想也许测试是异步运行并尝试访问连接池中的相同连接但是在调试时它们似乎同步执行。

编辑:这是失败测试的样子

[TestMethod]
    public void CanDoThings()
    {
        // Arrange            
        var before = _repository.Query().ToList();

        var command = new Command();

        // Act
        CommandHandler().Handle(command); // Throws error in here

        // Assert
        var after = _repository.Query().ToList();
    }

1 个答案:

答案 0 :(得分:0)

将_repository包装在using语句

中可能会抑制此错误

下面的代码块需要实例化并打开Connection

var result = Query().ToList();

由于延迟加载,上面的代码仅在下面的块(在使用语句范围的连接之外)中执行后才进行评估。

var before = _repository.Query().ToList();

由于您在using子句中初始化了connection,因此范围已经离开,您不知道Connection是否已被释放。我会尝试使用类似于下面的using语句包装每个存储库方法。

或者您需要在使用中迭代集合中的所有项目(.ToList())以获得可预测的结果。

[TestMethod]
public void CanDoThings()
{
    using (_repository=new MyRepository())
    {
        // Arrange            
        var before = _repository.Query().ToList();

        var command = new Command();

        // Act
        CommandHandler().Handle(command); // Throws error in here

        // Assert
        var after = _repository.Query().ToList();
    }
}