1

我正在尝试为使用 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 的情况下测试我的解决方案,但由于它最近被广泛使用,我很想学习如何处理它并强制它做我想做的事情。

4

2 回答 2

1

我会避免在您的测试项目中使用 WebActivator,因为它在 asp.net 之外无法正常运行。

如果你想测试你的 Ninject 内核的设置,我会公开 CreateKernel() 方法并从你的 Setup() 方法中调用它。

public static IKernel CreateKernel()

...

[SetUp]
public void Setup()
{
    NinjectMVC3.CreateKernel();
}
于 2012-01-06T16:03:32.653 回答
0

不幸的是,默认情况下,WebActivator 在 ac:\tmp... 目录中查找“*.dll”,因此无法找到解决方案中包含的项目库。

我最终获得了源代码并将以下代码添加到 ActivationManager 类:

public static void AddAssembly(Assembly assembly)
{
    if (_assemblies == null)
    {
        _assemblies = new List<Assembly>();
    }
    _assemblies.Add(assembly);
}

在测试类中:

 private const int PreStartInitStage_DuringPreStartInit = 1;
    [SetUp]
    public void Setup(){
        WebActivator.ActivationManager.AddAssembly(Assembly.GetAssembly(typeof(NinjectMVC3)));
        typeof(BuildManager).GetProperty("PreStartInitStage", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, PreStartInitStage_DuringPreStartInit, null);
        WebActivator.ActivationManager.RunPreStartMethods();
        Kernel = NinjectMVC3.GetKernel();
    }

这是丑陋的代码,我希望有一天能看到更好的方法。

于 2012-01-09T10:30:54.790 回答