2012-01-05 30 views
1

我想为使用Ninject的项目创建一个NUnit测试。该Ninject经的NuGet安装,所以配置CLAS类似于此简化版本:
测试通过Nuget安装Ninject项目 - WebActivate行为

[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项目的测试项目。我试图改变我的设置方法的实现调用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的解决方案,但由于它最近被广泛使用,我渴望学习如何处理它并迫使它做我想做的事情。

回答

0

不幸的是默认WebActivator会在AC一 “的* .dll”:\ tmp目录...目录,并且由于它是无法找到项目libriaries包含在解决方案中。

我结束了歌厅的源代码并添加以下代码到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(); 
    } 

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

1

我会避免从测试项目中使用WebActivator,因为它不会在asp.net之外发挥出色。

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

public static IKernel CreateKernel() 

...

[SetUp] 
public void Setup() 
{ 
    NinjectMVC3.CreateKernel(); 
} 
+0

感谢您的评论,但我们的想法是使用WebActivator,因为许多Nuget软件包都使用它,并且知道如何开箱即可测试它是很好的。 – 2012-01-09 10:21:21

相关问题