2

WinFormアプリケーション内でDataBindingをテストしようとしています。次のテストケースは失敗します。

[Test]
public void TestOneWayEntityBinding()
{
    //Arrange
    var entity = new MyEntity();
    entity.SomeProperty = "someValue";
    var userControl = new MyUserControl();
    const string pattern = @"xxx";

    //Act
    userControl.textBox.DataBindings.Add("Text", entity, "SomeProperty");
    userControl.textBox.Text = pattern;

    //Assert
    Assert.AreEqual(pattern, entity.SomeProperty);
}

バインディングインスタンスbに対してb.WriteValue()を明示的に呼び出しても、機能しません。

ありがとう、マルチェロ。

4

1 に答える 1

4

.Net フレームワークをテストしようとしているようです。あなたが所有していないコードのテストを書くべきではありません。ここでの適切なオプションは、 textBox テキストを設定して UI (例: White )に作用する受け入れテストです。

ところで、なぜtextBoxあなたのユーザーコントロールで公開されているのですか? 実装は非表示にする必要があります。type の 'Pattern' のようなプロパティを持つとよいでしょうstring。また、コントロール内で使用されているデータバインディングを公開しないでください。したがって、UI を実行したくない場合は、コントロールの適切なテストは次のようになります。

[Test]
public void ShouldUpdateEntityWhenPatternChanged()
{
    //Arrange
    var entity = new MyEntity() { SomeProperty = "someValue" };    
    var userControl = new MyUserControl() { Entity = entity };
    const string pattern = @"xxx";

    //Act    
    userControl.Pattern = pattern;

    //Assert
    Assert.That(entity.SomeProperty, Is.EqualTo(pattern));
}

理想的には、エンティティをモックして、SomeProperty が設定されていることを確認するだけです。現在、テストは次の 2 つの理由で失敗する可能性があるためです: テキスト ボックスが SomeProperty にバインドされていないか、SomeProperty セッターが正しく動作しません。

UPDATEプログラムでテキストを設定した後、バインディングが機能しない理由をここで見てください。検証時ではなくプロパティの変更時にバインディングを更新するには、次を使用します。

textBox.DataBindings.Add("Text", entity, "SomeProperty", true, DataSourceUpdateMode.OnPropertyChanged);

更新 検証のためにコントロールを表示する必要があるようです。DataSourceUpdateMode を変更したくない場合、および UI を使用せずにサービスでテストを実行しない場合は、単純な ControlTester が役立ちます。

public class ControlTester : IDisposable
{
    private Form _form = new Form();

    public ControlTester(Control control)
    {
        _form = new Form();
        _form.Controls.Add(control);
        _form.Show();
    }

    public void Dispose()
    {
        _form.Close();
    }
}

テスト対象のコントロールに作用するときに使用します。

using(new ControlTester(userControl))
    userControl.Pattern = pattern;

最終更新: 作成されていないコントロールに対して DataBining が機能していません。ここでオプション:

  • 偽のフォームを作成する (ControlTester を使用)
  • リアルフォームで走る
  • インスタンス化後に CreateControl() を呼び出す

最後のオプションが最良のオプションだと思います。テストで DataBinding を機能させるには、CreateControl() メソッドを呼び出すだけです。

[Test]
public void ShouldUpdateEntityWhenPatternChanged()
{
    //Arrange
    const string pattern = @"xxx";
    var entity = new MyEntity() { SomeProperty = "someValue" };    
    var userControl = new MyUserControl();
    userControl.CreateControl();
    userControl.Entity = entity;

    //Act    
    userControl.Pattern = pattern;

    //Assert
    Assert.That(entity.SomeProperty, Is.EqualTo(pattern));
}
于 2012-04-06T08:11:19.150 に答える