3

これは、エンティティで動作し、それをデータベースに保存してから、単体テストを作成できないために問題を引き起こすサンプル関数です。見てみな:

// this class exists in a Silverlight Class Library
public class EmployeeSaver
{
    ....

    public void Go()
    {
        Employee e = new Employee();

        e.Name="Jeremiah";

        ... // Other stuff that really needs to be tested

        _DataContext.Employees.Add(e);
        _DataContext.SubmitChanges();

    }
}

RIA サービスの性質上、DomainService は Silverlight 単体テスト フレームワーク内では実行されません。これは、単体テストを行うときに RIA にアクセスできないことを意味します。

モック データベースについて考えてきましたが、このクラスは実際には DB に追加するエンティティ (従業員) を作成します。モック データベースはこのエンティティを使用せず、元のエンティティに似た MockEntity クラスを使用するため、これは問題です。

RIA 自体をテストしようとしているのではなく、RIA によって生成されたエンティティをどのように使用するかをテストしようとしています。

私の最終目標は、次のような関数を作成することです。

[TestMethod]
public void Test()
{
    EmployeeSaver s = new EmployeeSaver();
    s.Go();

    Assert.IsEqual( DataContext.Employees.Last().Name, "Jeremiah" );
}

この機能をテストするにはどうすればよいですか? どのテスト フレームワークを使用すればよいですか? Silverlight Testing Framework を使用するのは難しいですか?

4

2 に答える 2

2

単体テストでは、インスタンスに_DataContextのスタブアウトされた実装が必要です。Goメソッドが呼び出され、次のように呼び出された場合:_DataContext.Employees.Add(e); _DataContext.SubmitChanges(); それはあなたのスタブを呼び出します。次に、スタブは、従業員が追加され、変更が送信されたという事実を記録する必要があります。

Goを呼び出した後、スタブにクエリを実行して、新しい従業員が追加されたことを確認し、SubmitChangesの呼び出しが発生したことを確認する必要があります。

二次的な注意として:Goが_DataContextのさまざまなメソッドを呼び出すかどうかを気にする必要がないという点で、他の回答の最後の部分には本当に同意しません。ここで_DataContextメソッドをテストする必要がないのは事実ですが、Goの単体テストでは、Goメソッドが_DataContextメソッドを正しく呼び出していることを確認する必要があります。理論的根拠は、Goメソッドのすべての行がテスト可能でなければならないということです。この検証を行わなかった場合は、_DataContextメソッドの呼び出しを削除してコードを壊すことができますが、単体テストではそれをキャッチできません。これは、ボブ・マーティンの「TDDの3つのルール」の原則を破ることになります。

于 2009-10-14T14:43:17.310 に答える
1

手巻きのモックデータベースは、オブジェクトをそのまま保存できます。リポジトリが の辞書に格納されるようなシステムを使用します。

といっても、そこまで行く必要はありません。RhinoMocks のようなもので _DataContext のモック インターフェイスを使用して、呼び出されると予想されるメソッドが確実に呼び出されるようにすることができます (_DataContext.SubmitChanges() が機能することは、このテストでは問題ではありません (それはユニット テストです)。 ) Go がオブジェクトを設定し、save を呼び出すことだけを気にします。

于 2009-10-13T21:29:28.173 に答える