2012-01-05 55 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

相關問題