Запустите WebActivator из модульного теста

Я пытаюсь писать интеграционные тесты. Поэтому мне нужно, чтобы методы запуска WebActivator выполнялись на этапе предварительной инициализации моих модульных тестов.

я пробовал это

[TestClass]
public class UnitTests
{
    [ClassInitialize]
    public static void Init(TestContext c)
    {   
        WebActivator.ActivationManager.Run();
    }

Но это всегда будет выдавать мне сообщение об ошибке:

Unable to create instance of class EL.NET.SecurityAdapter.Tests.UnitTests. Error: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: This method can only be called during the application's pre-start initialization stage..

с такой трассировкой стека

System.Web.Compilation.BuildManager.ThrowIfPreAppStartNotRunning()
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.LegacyModuleRegistrar.RegisterModule(Type moduleType)
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(Type moduleType)
<myproject>.Tests.App_Start.NinjectWebCommon.Start() in <myprojectPath>Tests\App_Start\NinjectWebCommon.cs: line 25
System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
WebActivator.BaseActivationMethodAttribute.InvokeMethod()
WebActivator.ActivationManager.RunActivationMethods[T]()
WebActivator.ActivationManager.Run()
<myproject>.Tests.UnitTests..ctor() in <myprojectPath>Tests\UnitTests.cs: line 40

Я знаю, что юнит-тесты должны работать с макетами, но мне действительно нужны эти интеграционные тесты.


person ckonig    schedule 19.06.2012    source источник
comment
Ваше приложение должно быть размещено на веб-сервере, если вы когда-либо планируете использовать этот метод. Интеграционные тесты обычно выполняются путем развертывания вашего приложения на каком-либо сервере, а затем инициирования HTTP-запросов к нему и проверки ответа. Существуют фреймворки, которые могут помочь вам автоматизировать эти веб-тесты. В конечных версиях Visual Studio эта функция встроена.   -  person Darin Dimitrov    schedule 19.06.2012
comment
Ну, я думал, что они добавили поддержку для вызова методов запуска вне ASP.NET... Но я не могу заставить его работать (blog.davidebbo.com/2011/02/)   -  person ckonig    schedule 19.06.2012
comment
Привет, не могли бы вы опубликовать всю трассировку стека? Вам нужно только вызвать WebActivator.ActivationManager.Run();, он вызовет методы перед запуском.   -  person Jakub Konecki    schedule 20.06.2012
comment
Я пытался использовать только метод Run(), произошла та же ошибка. Я добавил полную трассировку стека в сообщение.   -  person ckonig    schedule 21.06.2012


Ответы (1)


Я хотел запустить WebActivator для создания сопоставлений Ninject.

В итоге я создал интерфейс-оболочку для контейнера DI. Мои репозитории имеют доступ к DI только через эту оболочку.

В веб-приложении я использую специфичную для Ninject реализацию этого интерфейса, а для тестов я сделал собственную реализацию.

Я все еще думаю, что должна быть возможность каким-то образом заставить Ninject работать в модульных тестах, но пока это тоже работает.

person ckonig    schedule 22.06.2012