在内存测试中运行时,VS MSTest运行器锁定System.Data.SQLite.dll

问题描述

|| 我正在使用Fluent NHibernate通过sqlite 1.0.66.0运行内存数据库测试(MS测试):
[TestClass]
public abstract class InMemoryDatabaseTest
{
    private NHibernate.Cfg.Configuration configuration;
    private ISessionFactory sessionFactory;

    [Testinitialize]
    public void Initialize()
    {
        // All \"CreateConfiguration\" does is load FNh mappings.
        this.configuration = new NhConfigurationBuilder()
            .CreateConfiguration()
            .Database(() => sqliteConfiguration.Standard.InMemory())
            .BuildConfiguration();

        this.sessionFactory = this.configuration.BuildSessionFactory();
    }

    [TestCleanup]
    public void Cleanup()
    {
        new SchemaExport(this.configuration).Drop(false,true);
        sessionFactory.dispose();
    }

    protected ISession CreateSession()
    {
        var session = this.sessionFactory.OpenSession();

        // Re-create the database every time a new session is created.
        new SchemaExport(this.configuration)
            .Execute(script: false,export: true,justDrop: false,connection: session.Connection,exportOutput: null);

        session.BeginTransaction();
        return session;
    }
}
然后以这个为例:
[TestClass]
public class MessagesControllerTests : InMemoryDatabaseTest
{
    [TestMethod]
    public void sqlite_should_have_all_handles_released()
    {
        using (var session = this.CreateSession())
        {
            // Don\'t even need to do anything.
        }
    }
}
运行此测试后,我尝试对整个解决方案加2英镑。结果如下: 运行此测试(CTRL + R,CTRL + T)时,清理将按预期成功。 在(CTRL + R,T)中调试此测试时,清理失败并显示错误::3ѭ 我的第一个想法是确定,删除DLL。尝试执行此操作时,系统提示我“ѭ4”当前正在使用DLL。我使用Process Explorer进行了验证。由于某种原因,ms测试运行程序会在DLL上保留一个句柄。我曾尝试用另一个问题的一些建议来修改
Cleanup
方法,但仍然没有用:
[TestCleanup]
public void Cleanup()
{
    new SchemaExport(this.configuration).Drop(false,true);
    sessionFactory.Close();
    sessionFactory.dispose();
    sqliteConnection.ClearallPools();
    GC.Collect();
}
我已经能够在3台不同的机器上重现此内容解决该问题的任何已知方法将不胜感激。 更新:我已经清理了一些语言上的混乱。实际的解决方案配置可以在“调试/发布”中。但是,运行测试与调试测试会导致错误消息有所不同。     

解决方法

        我一直遇到类似的问题(尽管大多数处于Debug模式并使用MbUnit测试,但SQLite.dll被Visual Studio测试运行器锁定),发现使用TestDriven.net来运行我的测试可以解决此问题。在此之后,我再也没有深入研究MSTest运行程序。