1

Ninject を使用するプロジェクトの NUnit テストを作成しようとしています。Ninject は Nuget を介してインストールされたため、構成クラスは次の簡略化されたバージョンのようになります。

[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 にこれらのメソッドを「適切なタイミングで」呼び出すように指示する方法を探しています。1 つは MVC Web プロジェクト (および Ninject に WebActivator を使用) で、もう 1 つは私の 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 を使用せずに自分のソリューションをテストすることはできますが、最近広く使用されているため、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 に答える