加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

单元测试 – NUnit [TearDown]失败 – 访问我的文件有什么进程?

发布时间:2020-12-12 19:13:55 所属栏目:百科 来源:网络整理
导读:最终编辑:我找到了解决问题的方法(在问题的底部)。 我有一个Nunit问题,导致我的悲伤。编辑:实际上它看起来更像是一个SQLite问题,但我还没有百分之百的确定。 我的TestFixture有一个安装程序生成一个随机的文件名,用作我的每个测试中的SQLite数据库。 [S
最终编辑:我找到了解决问题的方法(在问题的底部)。

我有一个Nunit问题,导致我的悲伤。编辑:实际上它看起来更像是一个SQLite问题,但我还没有百分之百的确定。

我的TestFixture有一个安装程序生成一个随机的文件名,用作我的每个测试中的SQLite数据库。

[Setup]
public void Setup()
{
    // "filename" is a private field in my TestFixture class
    filename = ...; // generate random filename
}

我的每个测试在访问数据库的每个方法中使用这个结构:

[Test]
public void TestMethod()
{
    using (var connection = Connect())
    {
        // do database activity using connection

        // I've tried including this line but it doesn't help
        // and is strictly unnecessary:
        connection.Close();
    }
}

private DbConnection Connect()
{
    var connection = DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection();
    connection.ConnectionString = "Data Source=" + filename;
    connection.Open();
    return connection;
}

所以所有方法都使用一个帮助方法Connect()。我假设using(){}结构在TestMethod()结尾的连接上调用Dispose(),并释放与SQLite数据库文件的连接。

我的问题是我的[TearDown]方法:

[TearDown]
    public void Cleanup()
    {
        File.Delete(filename); // throws an IOException!
    }

每次测试我都会遇到一个例外:

System.IO.IOException: The process cannot access the file 'testdatabase2008-12-17_1030-04.614065.sqlite' because it is being used by another process.

所有的测试都失败,当他们到达[TearDown],所以我最终得到一个完整的临时数据库文件(每个测试,每个不同的名称)和一大堆失败的测试的目录。

访问文件的过程是什么?我不知道第二个进程如何访问该文件。连接已经完全超出范围,当我尝试删除文件时,Dispose()d,所以它不能与SQLite相关。它可以?

请注意,如果我运行所有测试或只进行一次测试,我将获得相同的结果。

更新:所以我尝试Dispose()我的DbCommand对象,因为我没有这样做(我假设Dispose()DbConnection的所有其他ADO.NET提供程序也Dispose()在该连接上的任何命令现在他们看起来像:

[Test]
public void TestMethod()
{
    using (var connection = Connect())
    {
        using (var command = connection.CreateCommand())
        {
        // do database activity using connection

        }
    }
}

它没有任何区别 – File.Delete()行仍然抛出一个IOException。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读