문제점 : 단위 테스트를 실행할 때 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을 사용하여 단위 테스트를 위해 클래스를 인스턴스화하는 데 유용한 구현 방법이 있다면, 나는 그것을보고 싶습니다!
대단히 감사합니다. 이 팁은 나를 올바른 방향으로 가리켰다. 내 원래 질문에 내 업데이 트를 참조하십시오. – EnLaCucha