【发布时间】:2026-02-07 15:35:02
【问题描述】:
我正在使用 nunit 和 ninject 在 VS2012 的新 MVC 4 解决方案中运行 ncrun。
当我第一次打开解决方案时,所有 50 个左右的测试运行并成功通过。
在我进行任何代码更改(即使只是添加了一个空白区域)后,ncrunch 报告我的大部分单元测试都失败了。如果我在 ncrunch 窗口中按“运行所有测试”,也会发生同样的事情。
但是,如果您点击“运行此处可见的所有测试”按钮,所有 50 次测试再次通过,并且 ncrun 报告一切都很好。
此外,当您单独运行每个测试时,它们每次都通过。
当他们确实失败时,他们似乎在我的 ninject 设置代码中失败了
错误:ControllerTestSetup 中的 TestFixtureSetUp 失败
public class ControllerTestSetup
{
[SetUp]
public void InitIntegrationTest()
{
var context = IntegrationTestContext.Instance;
context.Init();
context.NinjectKernel.Load<MediGapWebTestModule>();
}
[TearDown]
public void DisposeIntegrationTest()
{
IntegrationTestContext.Instance.Dispose();
}
}
public class IntegrationTestContext : IDisposable
{
private static IntegrationTestContext _instance = null;
private static readonly object _monitor = new object();
private IntegrationTestContext() { }
public static IntegrationTestContext Instance
{
get
{
if (_instance == null)
{
lock (_monitor)
{
if (_instance == null)
{
_instance = new IntegrationTestContext();
}
}
}
return _instance;
}
}
}
所有测试也在 resharper 测试运行器中运行,每次都没有问题。
有人知道是什么原因造成的吗?
我猜它与 Instance 属性中的单例锁定代码有关,但我不确定。
================================================ ================================ 进展:
我能够通过将其包装在 try catch 语句中并将错误写入输出窗口来追踪到上述 ninject 设置方法中的错误。
该异常是由于尝试多次加载模块而引起的,即使我绝对没有,也没有使用任何类型的自动模块加载。
这发生在行
LocalSessionFactoryModule.SetMappingAssemblies(() => new[] { typeof(ProviderMap).Assembly });
_kernel.Load<LocalSessionFactoryModule>();
_sessionFactory = _kernel.Get<ISessionFactory>();
其中 LocalSessionFactoryModule 是为 NinjectModule 类派生的 ninject 模块类。
为什么只有 ncrun 才会出现这种情况,我可以做些什么来解决这个问题?有没有办法检查模块是否已经加载?
【问题讨论】:
-
我想这是线程问题,因为 NCrunch 可能会在多个线程中运行您的测试。您可以尝试将线程数减少到一个吗? (在 NCrunch 配置向导中)
-
是的,试过了,但没有成功,同样的问题仍然存在。
-
那可能很难。我会添加一些跟踪代码,如
Trace.WriteLine("Teardown called")和Trace.WriteLine("context.Init was called")以查看 1)失败的地方 2)所有设置和初始化代码被调用了多少次 -
目前还没有更好的诊断方法。也许NCrunch作者可以:)