2012-01-05 10 views
1

Ninjectを使用するプロジェクトのNUnitテストを作成しようとしています。
Ninjectを介してインストールされた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(); 
    } 
} 

私はこれらのメソッドは、私の起動テストクラスで呼ばれるようにしたい:構成CLASは、この簡易版に似てNinjectは、Nuget経由でインストールされました。私が試した:

[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プロジェクトのテストプロジェクトの2つがあることを思い出してください。

[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の下に理解したように似た何かをする必要があります。だから問題は、WebActivatorにいくつかの追加のアセンブリをスキャンして、「適切な時間に」メソッドを起動するように、どうすればよいのかということです。あるいは、私はここで誤解しているかもしれません.Ninjectプロジェクトをテストするために、別のアプローチをとるべきでしょうか?

私はWebActivatorなしで私のソリューションをテストすることができますが、最近広く使われているので、私はそれに対処する方法を学びたいと思っています。

答えて

0

交流における "* .dllは" 探し:\ TMP ...ディレクトリ、および原因、プロジェクトのlibriariesを見つけることができないことにこれらはソリューションに含まれています。

私はソースコードをgetingと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()メソッドをpublicにしてSetup()メソッドから呼び出します。デフォルトWebActivatorにより、残念ながら

public static IKernel CreateKernel() 

...

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

コメントをいただきありがとうございますが、WebActivatorを使用することを考えています.Nugetパッケージでは多くのパッケージが使用されているため、WebActivatorを使用することです。 –

関連する問題