2013-08-28 1 views
0

문제점 : 단위 테스트를 실행할 때 Application.Current가 클래스에서 null입니다.AppDomain을 사용하여 단위 테스트 용 응용 프로그램 디스패처 제공

해결 방법 : 테스트 클래스를 실행할 응용 프로그램 도메인을 만듭니다. 응용 프로그램 도메인은 내 테스트 클래스에 대한 디스패처를 제공합니다.

코드 예제 :

 MyClassInTheAssembly myClass; 
     string path = @"C:\\pathToTheDll\\MyAssembly.dll"; 
     path = path.Replace(@"\\", @"\"); 
     AppDomainSetup setup = new AppDomainSetup { PrivateBinPath = path }; 
     AppDomain domain = AppDomain.CreateDomain("MyDomain", null, setup); 

     myClass = (MyClassInTheAssembly)domain.CreateInstanceFromAndUnwrap(path, typeof(MyClassInTheAssembly).FullName); 

myClass가 객체 단위 테스트에 Application.Current.Dispatcher을 사용하는 모든 public 메소드를 사용할 수 있습니다. myClass가에 단위 테스트를 실행할 때

나는 다음과 같은 오류가 나타날 수

생성자를 유형에 'MyAssembly.MyClassInTheAssembly'을 (를) 찾을 수 없습니다.

이 오류는 domain.CreateInstanceFromAndUnwrap() 메서드를 호출하여 내 테스트 클래스의 인스턴스를 만드는 동안 생성됩니다.

MyClassInTheAssembly 생성자에는 두 개의 필수 매개 변수가 있습니다. 매개 변수가있는 클래스의 AppDomain 인스턴스를 만들 수 있습니까? 올바른 방향으로 날을 가리키는위한 user779967에

UPDATE 감사합니다. 위의 질문에 대한 대답은 AppDomain.CreateInstanceFromAndUnwrap()에 대한 메서드 재정의를 사용하는 것입니다. 나는 내 테스트 클래스를 사용하여 응용 프로그램 도메인의 인스턴스를 생성하는 방법 재정의를 사용하여 시도 :

 object[] parameters = new object[2]; // object array to pass my required parameters. 
     parameters[0] = container; // Required constructor param for myClass. 
     parameters[1] = eventAggregator; // Required constructor param for myClass. 
     myClass = (MyClassInTheAssembly)domain.CreateInstanceFromAndUnwrap(path, typeof(MyClassInTheAssembly).FullName, true, BindingFlags.Default, null, parameters, null, null); 

아이디어는 내 테스트 클래스의 인스턴스 내 필요한 매개 변수를 전달하려면이 방법 재정의를 사용하는 것이 었습니다. 그런 다음 모든 내 단위 테스트에 디스패처 스레드를 제공하는 AppDomain에서 파생 된 테스트 클래스를 사용할 수 있습니다.

이 코드를 실행할 때 다음과 같은 SerializationException이 수신되었습니다. 'Castle.DynamicProxy.Serialization.ProxyObjectReference, NSubstitute, Version = 1.6.1.0, Culture = neutral, PublicKeyToken = 92dd2e9066daa5ca'멤버에 대해 유형이 확인되지 않았습니다. 이것은 컨테이너 및 eventaggregator 클래스를 테스트 할 때 NSubstitute를 사용해야하기 때문입니다. AppDomain 메서드는 NSubstitute가 아닌 IUnityContainer와 IEventAggregator의 정확한 매개 변수 유형 일치를 찾고 있습니다.

AppDomain을 사용하여 단위 테스트를 위해 테스트 클래스를 인스턴스화하려는 시도를 포기했습니다.

 var dispatcher = Application.Current != null ? Application.Current.Dispatcher : Dispatcher.CurrentDispatcher; 

     if (dispatcher.CheckAccess()) 
     { 
      do something.... 
     } 
     else dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => CallMethodAgain())); 

생산에 내 코드를 실행, Application.Current는 null해서는 안 : 나는 다음과 같이 내 테스트 클래스 메소드 내에서 Application.Current을 처리하기로 결정했다. 유닛 테스트를 위해 코드를 실행할 때 Dispatcher.CurrentDispatcher를 사용하여 실행 스레드에서 디스패처를 만듭니다.

누군가가 AppDomain을 사용하여 단위 테스트를 위해 클래스를 인스턴스화하는 데 유용한 구현 방법이 있다면, 나는 그것을보고 싶습니다!

답변

0

확인 http://msdn.microsoft.com/en-us/library/dd387239.aspx

CreateInstanceAndUnwrap

의 오버로드 버전은 형식 개체 []의 배열을 생성하고 생성자 인수를 채울 필요가 있다고 보인다.

+0

대단히 감사합니다. 이 팁은 나를 올바른 방향으로 가리켰다. 내 원래 질문에 내 업데이 트를 참조하십시오. – EnLaCucha

관련 문제