39

私は、ADO .NET Entity Framework に対して記述された単体テスト コードです。インメモリ データベースに行を入力し、コードがそれらを適切に取得することを確認したいと考えています。

Rhino モックを使用して Entity Framework をモックできますが、それだけでは不十分です。どのエンティティを返すかをクエリに伝えます。これは、where 句も .Include() ステートメントもテストしません。where 句が意図した行のみに一致し、他の行には一致しないことを確認したいと考えています。必要なエンティティを要求し、不要なエンティティは要求していないことを確認したいと思います。

例えば:

class CustomerService
{
    ObjectQuery<Customer> _customerSource;
    public CustomerService(ObjectQuery<Customer> customerSource)
    {
        _customerSource = customerSource;
    }
    public Customer GetCustomerById(int customerId)
    {
        var customers = from c in _customerSource.Include("Order")
            where c.CustomerID == customerId
            select c;
        return customers.FirstOrDefault();
    }
}

ObjectQuery をモックして、注文が入力された既知の顧客を返す場合、CustomerService に適切な where 句と Include があることをどのように確認できますか? 顧客の行と注文の行をいくつか挿入してから、適切な顧客が選択され、注文が取り込まれたことをアサートします。

4

8 に答える 8

16

InMemory プロバイダーはEF7 (プレリリース) に含まれています。

NuGet パッケージを使用するか、GitHubのEF リポジトリでそれについて読むことができます (ソースを表示)。

于 2015-04-30T19:20:37.553 に答える
13

記事 http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effortでは、メモリ内で実行されるEffort   -Entity Framework プロバイダー  について説明 しています。

実際のデータベースがなくても、単体テスト内で DbContext または ObjectContext クラスを引き続き使用できます。

于 2012-12-29T06:34:23.857 に答える
9

ここでのより良いアプローチは、リポジトリ パターンを使用して EF コードをカプセル化することです。サービスをテストするときは、モックまたはフェイクを使用できます。リポジトリをテストするときは、期待どおりの結果が得られることを確認するために、実際の DB にアクセスする必要があります。

于 2009-02-22T18:54:53.463 に答える
6

はい、そのようなプロバイダーが少なくとも 1 つあります - SQLite。私はそれを少し使用しましたが、動作します。また、 SQL Server Compactを試すこともできます。これは組み込みデータベースであり、EF プロバイダーもあります。
編集:
SQLite はインメモリ データベース ( link1 ) をサポートしています。必要なのは、"Data Source=:memory:;Version=3;New=True;" のような接続文字列を指定することだけです。例が必要な場合は、SharpArchitectureをご覧ください。

于 2009-02-22T18:36:56.737 に答える
2

私は Entity Framework と ObjectQuery クラスに精通していませんが、Include メソッドが仮想の場合、次のようにモックできます。

// Arrange
var customerSourceStub = MockRepository.GenerateStub<ObjectQuery<Customer>>();
var customers = new Customer[] 
{
    // Populate your customers as if they were coming from DB
};
customerSourceStub
    .Stub(x => x.Include("Order"))
    .Return(customers);
var sut = new CustomerService(customerSourceStub);

// Act
var actual = sut.GetCustomerById(5);

// Assert
Assert.IsNotNull(actual);
Assert.AreEqual(5, actual.Id);
于 2009-02-22T16:53:44.800 に答える
1

SQL Server Compactを試すこともできますが、非常に大きな制限がいくつかあります。

  • SQL Server Compact は、Entity Framework と共に使用される場合、ページング クエリで SKIP 式をサポートしません。
  • SQL Server Compact は、Entity Framework と共に使用される場合、サーバーによって生成されたキーまたは値を持つエンティティをサポートしません。
  • 外部結合なし、照合、フロートのモジュロ、集計
于 2009-02-23T08:31:14.280 に答える