就我而言,它是Resharper Unit Tests运行器(加上NUnit 测试,MsTests 从来没有这样的问题)。杀死进程后,能够重建进程,而无需重新启动操作系统或 VS2013。
其他测试运行器,如xUnit可能会导致相同的问题。
那么有帮助的是检查您是否可以添加 Dispose 模式,例如,如果您正在添加 DbFixture 并且数据库联系人未正确处理。即使测试完成,这也会导致程序集文件被锁定。
请注意,您可以将 IDisposable 接口添加到 DbFixture 并让 IntelliSense 添加 Dispose 模式。然后,处理相关的包含属性并将它们显式分配给 null。
这将有助于以干净的方式结束测试并在测试结束后立即解锁相关的锁定文件。
示例(xUnit 测试使用 DBFixture):
public class DbFixture: IDisposable
{
private bool disposedValue;
public ServiceProvider ServiceProvider { get; private set; }
public DbFixture()
{
// initializes ServiceProvider
}
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// dispose managed state (managed objects)
ServiceProvider.Dispose();
ServiceProvider = null;
}
// TODO: free unmanaged resources (unmanaged objects) and override finalizer
// TODO: set large fields to null
disposedValue = true;
}
}
// // TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
// ~DbFixture()
// {
// // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
// Dispose(disposing: false);
// }
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
测试类本身需要相同的模式 - 它需要自己的 Dispose 方法(如上面的 DbFixture 类所示):
public SQL_Tests(ITestOutputHelper output)
{
this.Output = output;
var fixture = new DbFixture(); // NOTE: MS Dependency injection framework didn't initialize when the fixture was a constructor param, hence it is here
_serviceProvider = fixture.ServiceProvider;
} // method
所以它需要_serviceProvider
在自己的 Dispose 方法中释放其本地属性,因为测试类构造函数SQL_Tests
实例化了它。