2013-09-27 2 views
1

단위 테스트를 통해 라이브러리를 테스트해야합니다.WPF 응용 프로그램이 필요할 때 단위 테스트 방법은 무엇입니까?

라이브러리는 불행히도 매개 변수로 System.Windows.Application 인스턴스를 사용합니다. 일반적으로 실제 WPF 응용 프로그램에서는 public partial class App : Application 항목 App.xaml 응용 프로그램 클래스가됩니다.

라이브러리가 처리기를 등록하는 데 사용하는 DispatcherUnhandledException 이벤트에 필요합니다.

WPF 유닛 테스트 라이브러리에서 null 인 Application.Current을 조롱하거나 초기화하는 방법이 있습니까?

감사합니다.

답변

6

인터페이스를 구현하는 다른 클래스로 래핑하십시오. 유닛 테스트가 mock 구현을 주입 할 때.

public interface IExceptionManager 
{ 
    event DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException; 
} 

public class ExceptionManager : IExceptionManager 
{ 
    Application _app; 

    public ExceptionManager(Application app) 
    { 
     _app = app; 
    } 

    public event DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException 
    { 
     add 
     { 
      _app.DispatcherUnhandledException += value; 
     } 

     remove 
     { 
      _app.DispatcherUnhandledException -= value; 
     } 
    } 
} 

public class MockExceptionManager: IExceptionManager 
{ 
    public event DispatcherUnhandledExceptionEventHandler DispatcherUnhandledException; 
} 
+0

이것은 내가 찾고있는 효율적인 방법 일 것입니다. 리팩토링하고 내 솔루션을 시도해 봅니다. 감사. –

+0

완벽하게 작동했습니다. 감사. –

0

흠 ... 보통이 당신의 App.xaml.cs를가 (난 당신이 액세스 할 수있는 속성을 추가,하지만 당신은 필요하지 않은 경우 그것을 무시했습니다) 모습입니다 :

public partial class App : Application 
    { 
     static App() 
     { 
      DispatcherHelper.Initialize(); 
      ExampleProp = "whatever floats your boat here"; 

     } 

     /// <summary> 
     /// You can access this from any class by using "App.ExampleProp". 
     /// </summary> 
     public static string ExampleProp{ get; set; } 
    } 
} 

이제는 "App.MyExampleProp"을 사용하여 어느 곳에서나 액세스 할 수 있습니다. 그러나 App이 Application을 확장하므로 App.Current가 있으므로 현재 액세스 할 수 있습니다. 신청.

+0

단위 테스트 라이브러리 프로젝트에서이 방법이 유용 할 수 있습니다. 나는 무엇인가 놓친다. –

+0

신청서에 액세스하는 것에 대해 질문했습니다. 추가 정보를 주면 최대한의 답변이 이동하는 것처럼 보입니다. – Noctis