Тестирование проекта Ninject, установленного через Nuget - поведение WebActivate - PullRequest
1 голос
/ 05 января 2012

Я пытаюсь создать тест NUnit для проекта, который использует Ninject. 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 для вызова этих методов в «правильное время». Напомню, что есть два проекта, с которыми я имею дело, один - это веб-проект MVC (и он использует WebActivator для Ninject), а другой - тестовый проект для моего веб-проекта MVC. Я попытался вызвать 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, но, поскольку он широко используется в последнее время, я стремлюсь научиться справляться с ним и заставлять его делать то, что я хочу.

Ответы [ 2 ]

1 голос
/ 06 января 2012

Я бы не стал использовать WebActivator из вашего тестового проекта, так как он не будет хорошо работать за пределами asp.net.

Если вы хотите протестировать настройку ядра Ninject, чем я бы сделал метод CreateKernel ()public и вызовите это из вашего метода Setup ().

public static IKernel CreateKernel()

...

[SetUp]
public void Setup()
{
    NinjectMVC3.CreateKernel();
}
0 голосов
/ 09 января 2012

К сожалению, по умолчанию WebActivator ищет «* .dll» в каталоге ac: \ tmp ..., и из-за этого ему не удается найти библиотеки проекта, которые включены в решение.

IВ итоге мы получили исходный код и добавили следующий код в класс 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();
    }

Это ужасный код, и я надеюсь увидеть егодень лучше подход.

...