メソッドの単体テストをいくつか書きたいと思います。ただし、このメソッドは私のエンティティフレームワークを参照しています。これが私がテストしたいメソッドの非常に工夫された例です:
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
コンストラクターにフィードします。ただし、これは(データベースエンジンにヒットするため)はるかに遅くなり、単体テストは高速になるはずです。また、以前は必要なかったデータベース定義コードをアプリケーションに取り込む必要があります。
エンティティフレームワークで何かをテストすることは、通常、単体テストではなく統合テストに行くことを私は知っています。ただし、これらのテストは実際には統合をテストしません-データベースクエリは非常に単純であり、配列に対しても同様である可能性があります-クエリの正しい選択が私のメソッドによって行われることを確認したいだけです。