最终编辑:我找到了解决问题的方法(在问题的底部)。
我有一个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。 原文链接:https://www.f2er.com/sqlite/197920.html