2010-12-27 10 views
15

단위 테스트를 위해 WPF 컨트롤을 테스트하고 키 누르기를 시뮬레이션해야합니다. 가능한 해결책을 보았습니다. here 그러나 PresentationSource를 전달하려고 할 때 예외를 트리거하는 Null 값 (PresentationSource.FromVisual() 또는 PresentationSource.FromDependencyObject())이 계속 나타납니다.WPF 단위 테스트를 위해 keydown 프레스를 프로그래밍 방식으로 생성합니다.

제 질문은 단위 테스트에서 사용할 수있는 null이 아닌 PresentationSource를 얻는 방법입니다.

답변

3

이 내용을 읽은 후 이것을 알아 낸 내용은 post입니다.

기본적으로 컨트롤을 Window 안에두고 Window.Show()를 호출해야합니다. WPF 버그가 언급 된 게시물이지만 WPF 4에서는이 문제가 발생하지 않았습니다.

Window.Show()를 호출 한 후 프레젠테이션 원본이 더 이상 null이 아니며 키를 컨트롤에 보낼 수 있습니다.

public class FakePresentationSource : PresentationSource 
{ 
    protected override CompositionTarget GetCompositionTargetCore() 
    { 
     return null; 
    } 

    public override Visual RootVisual { get; set; } 

    public override bool IsDisposed { get { return false; } } 
} 

을 그리고 다음과 같이 사용 :

+0

는 'CurrentDispatcher'에 'InvokeShutdown'를 호출 출구에있는 'InvalidComObjectException를'해결의 잃어버린 고리 (missing link)이었다. 링크 주셔서 감사합니다! – karmasponge

+4

링크가 죽었습니다 ... – Vaccano

17

이 같은 PresentationSource 클래스를 확장 할 수 있습니다 단위 테스트에 대한

var uiElement = new UIElement(); 

uiElement.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, new FakePresentationSource(), 0, Key.Delete) 
{ 
    RoutedEvent = UIElement.KeyDownEvent 
}); 
+0

@ bill-tarbell에 의해 Moq가 작동하는 것처럼 작동합니다 – mungflesh

6

빠른 해결책은 바로 PresentationSource 개체를 조롱하는 것입니다. STA 스레드가 필요합니다. 샘플은 Moq 및 nunit를 사용합니다.

[Test] 
[RequiresSTA] 
public void test_something() 
{ 
    new KeyEventArgs(
    Keyboard.PrimaryDevice, 
    new Mock<PresentationSource>().Object, 
    0, 
    Key.Back); 
} 
관련 문제