2012-01-05 2 views
1

Ninject를 사용하는 프로젝트에 대한 NUnit 테스트를 만들려고합니다. Ninject에이 구성 제공자 라이선스 계약이 단순화 된 버전과 유사하므로, Nuget를 통해 설치 :
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(); 
    } 
} 

나는 그 방법은 내 시작 테스트 클래스에서 호출하려는. 나는 시도 :

[TestFixture] 
public class TestBase 
{ 

    [SetUp] 
    public void Setup() 
    { 
     NinjectMVC3.Startup(); 
    } 


    [TearDown] 
    public void TearDown() 
    { 
     NinjectMVC3.TearDown(); 
    } 
} 

내가 수동으로 WebActivator에 의해 관리되는 메소드를 호출하는 것을 시도하고 있기 때문에이 작동하지 않습니다. 그래서 저는 WebActivator가 '적절한 시간에'메서드를 호출하도록 지시하는 방법을 찾고 있습니다. MVC 웹 프로젝트 (그리고 Ninject 용 WebActivator를 사용함)와 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가없는 솔루션을 테스트 할 수 있지만 최근 널리 사용되어 왔기 때문에이를 해결하고 원하는 작업을 수행하는 방법을 배우려합니다.

답변

0

는 교류에 "* .DLL"을 찾습니다 : \ TMP ..., 그리고 그것으로 인해 프로젝트 libriaries을 찾을 수없는 것과 디렉토리 솔루션에 포함되어 있습니다.

public static void AddAssembly(Assembly assembly) 
{ 
    if (_assemblies == null) 
    { 
     _assemblies = new List<Assembly>(); 
    } 
    _assemblies.Add(assembly); 
} 

그리고 테스트 클래스 :

나는 소스 코드에 geting하고 ActivationManager 클래스에 다음 코드를 추가 결국

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() 메소드에서 호출하십시오.

public static IKernel CreateKernel() 

는 ... 기본 WebActivator으로

불행하게도
[SetUp] 
public void Setup() 
{ 
    NinjectMVC3.CreateKernel(); 
} 
+0

많은 Nuget 패키지에서 WebActivator를 사용하기 때문에 의견을 보내 주셨지만, WebActivator를 사용하는 것이 좋습니다. 상자에서 직접 테스트하는 방법을 알고있는 것이 좋습니다. –

관련 문제