6

次の問題に遭遇しました...データベースコンテキストがあります:

// For support unit testing... 
public interface IDbContext : IDisposable
{
   IQueryable<Hardware> Hardwares { get; }
   IQueryable<ProviderHardware> ProviderHardwares { get; }
}

// Real DbContext (EF 4.0, Code First)
public class PrimaryDbContext : DbContext, IDbContext
{
   public DbSet<Hardware> Hardwares { get; set; }
   public DbSet<ProviderHardware> ProviderHardwares { get; set; }

   IQueryable<Hardware> IDbContext.Hardwares
     { get { return Hardwares; } }
   IQueryable<ProviderHardware> IDbContext.ProviderHardwares
     { get { return ProviderHardwares; } } 
   ...
}

そして、ProviderHardwares テーブルに存在しないすべてのハードウェアを取得しようとします。

var hardwaresRemoved = db.Hardwares.Where(i => (i.IsAvailable == true) &&
   (db.ProviderHardwares.Count(j => j.Article == i.Article) == 0)).ToList();

「PrimaryDbContext db = new PrimaryDbContext();」のように厳密に PrimaryDbContext を使用する場合 すべて正常に動作します。しかし、暗黙的に「IDbContext db = new PrimaryDbContext();」を使用すると、例外が発生すること:

タイプ 'ConfiguratorMvcApplication.DomainModels.ProviderHardware' の定数値を作成できません。このコンテキストでは、プリミティブ型 (Int32、String、および Guid など) のみがサポートされます。

要約すると、IQueryable で DbSet を置き換えることはできません。この場合、ユニットテストをどのように使用できますか? 誰かがこの問題を解決してくれることを願っています... よろしくお願いします!

4

2 に答える 2

-2

DbSet を保持し、データベースを含めて統合 テストを行うことをお勧めします。

DB のモックを使用して単体テストに合格することは多少役立つ可能性がありますが、実際のデータベースを使用してテストする方がよいでしょう (ただし、単体テストではありません)。

ClassInitialize で、データベースを消去するか、テスト用の初期データを作成します。

接続文字列を使用して App.config ファイルを作成すると、別のテスト データベースを作成できます。EF Code First を使用している場合は、無料で入手できます。

よろしくお願いします。

于 2011-09-01T06:31:25.483 に答える