0

メソッドの単体テストをいくつか書きたいと思います。ただし、このメソッドは私のエンティティフレームワークを参照しています。これが私がテストしたいメソッドの非常に工夫された例です:

public int GetNumberWithName(string name, NWRevalDatabaseEntities entities)
{
    int number = (from n in entities.TableOfNumbers
                    where n.Name == name
                    select n).First();

    return number;
}

質問:

実行可能なデータベース接続を与えずNWRevalDatabaseEntitiesにテストクラスのオブジェクトをインスタンス化する方法はありますか?したがって、すべてのテーブルが空になり、テストに必要なエンティティを挿入するだけで、データベースに永続化することはありませんか?

のストアNWRevalDatabaseEntitiesはSQLiteデータベースであり、使用可能な自動生成コンストラクターは次のとおりです。

/// <summary>
/// Initializes a new NWRevalDatabaseEntities object using the connection string found in the 'NWRevalDatabaseEntities' section of the application configuration file.
/// </summary>
public NWRevalDatabaseEntities() : base("name=NWRevalDatabaseEntities", "NWRevalDatabaseEntities")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

/// <summary>
/// Initialize a new NWRevalDatabaseEntities object.
/// </summary>
public NWRevalDatabaseEntities(string connectionString) : base(connectionString, "NWRevalDatabaseEntities")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

/// <summary>
/// Initialize a new NWRevalDatabaseEntities object.
/// </summary>
public NWRevalDatabaseEntities(EntityConnection connection) : base(connection, "NWRevalDatabaseEntities")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    OnContextCreated();
}

これらはすべて、接続または接続文字列を必要とします(または保存された接続文字列を使用します)。

これが不可能な場合は、インメモリSQLiteデータベースの作成を検討し、その接続をNWRevalDatabaseEntitiesコンストラクターにフィードします。ただし、これは(データベースエンジンにヒットするため)はるかに遅くなり、単体テストは高速になるはずです。また、以前は必要なかったデータベース定義コードをアプリケーションに取り込む必要があります。

エンティティフレームワークで何かをテストすることは、通常、単体テストではなく統合テストに行くことを私は知っています。ただし、これらのテストは実際には統合をテストしません-データベースクエリは非常に単純であり、配列に対しても同様である可能性があります-クエリの正しい選択が私のメソッドによって行われることを確認したいだけです。

4

1 に答える 1

2

実行可能なデータベース接続を提供せずにテストクラスでNWRevalDatabaseEntitiesオブジェクトをインスタンス化する方法はありますか?そのため、すべてのテーブルが空になり、テストに必要なエンティティを挿入するだけで、データベースに永続化することはありませんか?

いいえ。

ただし、これは(データベースエンジンにヒットするため)はるかに遅くなり、単体テストは高速になるはずです。また、以前は必要なかったデータベース定義コードをアプリケーションに取り込む必要があります。

ただし、メソッドはEFに依存しているため、EF=データベースで機能することをテストする必要があります。

エンティティフレームワークで何かをテストすることは、通常、単体テストではなく統合テストに行くことを私は知っています。ただし、これらのテストは実際には統合をテストしません-データベースクエリは非常に単純であり、配列に対しても同様である可能性があります-クエリの正しい選択が私のメソッドによって行われることを確認したいだけです。

単純化されているかどうかにかかわらず、これはLinq-to-entitiesを使用したデータベースクエリです。これは、Linq-to-objectsを使用した配列クエリではありません。このクエリも非常に単純です。-entities.TableOfNumbers.Last()配列では機能しますが、EFでは機能しません。クエリをテストしたくない場合は、テストするメソッドからクエリを分離します。

public int GetNumberWithName(string name, NWRevalDatabaseEntities entities)
{
    int number = ExecuteQuery(entities, Name);
    return number;
}

ExecuteQueryここで、テスト用のメソッドを置き換える方法を見つける必要があります。protected virtualテストしたいのは、正しいNameパラメーターを受け取りGetNumberWithName、から受け取ったのと同じ番号を返すことだけなので、テスト用に作成してオーバーライドすることができますExecuteQuery

ExecuteQueryここで、統合テストを記述して、LinqクエリがEFで機能することを確認する必要があります。

于 2012-09-07T09:24:33.383 に答える