2010-06-09 3 views
4

내가 시험에서 다음을 수행하는 코드의 조각에 내 단위 테스트를 실행 해요 : 아이콘 속성에 대한 게터 내부System.Windows.Controls.Image를 작성하면 예외가 발생합니다. 디스패처를 사용하여 인스턴스화하는 방법은 무엇입니까?

Assert.IsNotNull(target.Icon); 

, 나는이 일을 해요 :

System.Windows.Controls.Image img = new System.Windows.Controls.Image(); 

System.InvalidOperationException : 많은 UI 구성 요소에서이를 필요로하기 때문에 호출하는 스레드는 STA 여야합니다.

나는 Dispatcher를 사용해야한다는 것을 이해하지만, 어떻게 또는 왜 ... 이건 내 ViewModel의 속성이고 나는 어떤 것도 가지지 않는다는 것을 조금 혼란스러워합니다. 이러한 예외는 응용 프로그램을 실행할 때 발생합니다.

기타 정보 : 이것은 단지 당신이 다른 비 UI 스레드를 사용하고 .NET 4.

답변

1

여기서 문제는 STA가 제대로 실행되어야하지만 단위 테스트 프레임 워크가 MTA를 사용하는 WPF 단위 테스트입니다. STA에서 테스트를 실행하려면 유닛 테스팅 프레임 워크를 설정해야합니다.

각 프레임 워크에는 다른 방법이 있습니다. 일반적으로 테스트 프레임 워크 이름과 STA를 google에 입력하면 찾을 수 있습니다.

+0

그래, 그랬어 (NUnit을 사용 했으니 완벽 했어!) –

0

로 업그레이드 할 때 실패 시작? 그렇다면이 부동산에 액세스하지 않았습니까? 스레드를 사용하거나 (FileSystemWatcher와 같이)이 속성을 사용할 수있는 비동기 적으로 실행되는 프레임 워크의 구성 요소를 사용하고 있는지 확인하십시오. 그러나 더 많은 코드가 도움이 될 것입니다.

Thread backgroundThread; 
backgroundThread = new Thread(DoWork); 
backgroundThread.SetApartmentState(ApartmentState.STA); 
backgroundThread.Start(); 

난 당신이 사용하고있는 단위 테스트 프레임 워크와이 모델을 스레딩있어 변경하는 방법을 알고하지 않습니다

1

단위 테스트를 실행하는 스레드가 STA 스레드하지, 당신은 그와 같은 STA 스레드를 만들 수 Thread.SetApartmentState를 호출하기 전에 Thread.SetApartmentState를 호출해야합니다.

"아파트 상태"는 COM 항목이므로 많은 WPF 컨트롤에 COM이 필요하므로 STA 스레드에 연결된 디스패처가 자동으로 없기 때문에 이는 WPF에서 필요합니다.

일반적으로 운영자에 대해 걱정할 필요가 없으며 필요한 경우 시스템이 생성합니다.

스레드에 대한 디스패처를 만들려면 Dispacher.CurrentDispacher을 읽을 수 있지만 Dispacher.Run을 호출하여 스레드를 제어 할 수있는 경우가 아니면 해당 디스패처에서 의미있는 작업을 수행 할 수 없습니다.

0

은 당신이 당신의 접근 방식을 조금 변경해야 할 수도 있다고 생각합니다. 이미지 컨트롤이 아닌 이미지의 URI를 노출하도록 ViewModel을 수정하면됩니다.

단위 테스트에서 이미지 소스가 올바른 위치로 설정되었는지 확인하고 UI에서 이미지 컨트롤의 소스를 URI에 바인딩해야합니다.

+0

이상적으로 네,하지만이 경우 ViewModel은 특정 속성에 따라 두 개의 서로 다른 BitMaps에서 이미지 객체를 동적으로 생성합니다. URL에 하드 코딩되지 않았습니다. –

관련 문제