4

ユニットテストで重要なイベントを発生させたいのですが。キーが押されたとき、TextBoxのtextプロパティに押されたキーが含まれている必要があります。

Xunitを使用した最小限の動作例を次に示します。

[TemplatePart(Name = Field0Name, Type = typeof(TextBox))]
class MyControl : Control
{
    public const string Field0Name = "Field0";
}

public class MyControlTests
{
    private MyControl control;
    public MyControlTests()
    {
        MemoryStream ms = new MemoryStream();
        StreamWriter sw = new StreamWriter(ms);
        sw.Write(@"<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
                        <Grid>
                            <TextBox Name='Field0'/>
                        </Grid>
                    </ControlTemplate>");
        sw.Flush();
        ms.Position = 0;

        control = new MyControl() { Template = (ControlTemplate)XamlReader.Load(ms) };
        control.ApplyTemplate();
    }

    [Fact]
    public void Field0Name_PreviewKeyDownEvent_WriteLetter()
    {
        TextBox tb = (TextBox)control.Template.FindName(MyControl.Field0Name, control);
        FocusManager.SetFocusedElement(control, tb);

        tb.RaiseEvent(new KeyEventArgs(Keyboard.PrimaryDevice, new FakePresentationSource(), Environment.TickCount, Key.A)
        {
            RoutedEvent = TextBox.PreviewKeyDownEvent
        });

        Assert.Equal("a", tb.Text);
    }
}

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

    public override Visual RootVisual { get; set; }

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

Generic.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TextBoxRaiseEventProject">
<Style TargetType="{x:Type local:MyControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyControl}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Grid>
                        <TextBox x:Name="Field0"/>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

試験報告書:

試験報告書

4

1 に答える 1

-2

この回答は、あなたが期待していたものではなく、質問に対して期待していたものでもありません。それでも、私はそれが正しいと思います。それを読んだ後、単体テストへのアプローチを再考してください.

ユニットテストでボタンクリックを呼び出すことは、機能をユニットテストするための最良の方法ではないと思います。これが、MVVM、MVC、MVP などのパターンの理由の 1 つです。UI の使用とは別に、テスト可能なクラスを作成する必要があります。(講義のように聞こえるようにするつもりはないので、申し訳ありません)。

したがって、あなたの例では、コマンドを作成し、それをボタンにバインドして使用し、テスト可能なコンポーネント/パーツをトリガーするコマンドを呼び出して単体テストをベースにします..

<Button Command="{Binding PushButtonCommand}"..

some class MyClass
{
    public ICommand PushButtonCommand
    {
        get
        {
           return _pushButtonCommand ??
                (_pushButtonCommand = new DelegateCommand(ExecutePushButton));
        }
     }

    private void ExecutePushButton()
    {
         //lets pretend it sets some property that you need to test;
         NeedBacon = true;   
    }

これでテスト可能になりました。クラスを作成した後の単体テストで、コマンドをトリガーしてプロパティを確認します。

Assert.IsFalse(myClassInstance.NeedBacon);
((DelegateCommand)myClassInstance.PushButtonCommand).Execute(null);
Assert.IsTrue(myClassInstance.NeedBacon);
于 2013-06-13T19:37:53.837 に答える