我正在尝试为使用 Ninject 的项目创建 NUnit 测试。Ninject 是通过 Nuget 安装的,因此 Configuration 类看起来类似于这个简化版本:
[assembly: WebActivator.PreApplicationStartMethod(typeof(NinjectMVC3), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(NinjectMVC3), "Stop")]
public static class NinjectMVC3
{
private static readonly Bootstrapper Bootstrapper = new Bootstrapper();
private static IKernel _kernel;
public static void Start()
{
DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
Bootstrapper.Initialize(CreateKernel);
}
public static void Stop()
{
Bootstrapper.ShutDown();
}
}
我希望在我的启动测试类中调用这些方法。我试过:
[TestFixture]
public class TestBase
{
[SetUp]
public void Setup()
{
NinjectMVC3.Startup();
}
[TearDown]
public void TearDown()
{
NinjectMVC3.TearDown();
}
}
它不起作用,因为我试图手动调用由 WebActivator 管理的方法。所以我正在寻找一种方法来指示 WebActivator 在“正确的时间”调用这些方法。让我提醒您,我正在处理两个项目,一个是 MVC Web 项目(它使用 WebActivator for Ninject),另一个是我的 MVC Web 项目的测试项目。我试图通过更改我的 Setup 方法的实现来调用 WebActivator:
[SetUp]
public void Setup()
{
WebActivator.ActivationManager.Run();
}
它不起作用。据我了解,在此调用下,WebActivator 应该执行以下操作:
foreach (var assemblyFile in Directory.GetFiles(HttpRuntime.BinDirectory, "*.dll")) {
var assembly = Assembly.LoadFrom(assemblyFile);
foreach (PreApplicationStartMethodAttribute preStartAttrib in assembly.GetCustomAttributes(
typeof(PreApplicationStartMethodAttribute),
inherit: false)) {
preStartAttrib.InvokeMethod();
}
}
所以我猜它无法找到一个程序集。所以问题是 - 我如何命令 WebActivator 通过一些额外的程序集进行扫描并在“正确的时间”触发一些方法。或者我在这里被误导了,为了测试我的 Ninject 项目,我应该采取不同的方法?
我可以在没有 WebActivator 的情况下测试我的解决方案,但由于它最近被广泛使用,我很想学习如何处理它并强制它做我想做的事情。