2012-03-09 4 views
2

私のプロジェクト全体でEntity Framework 4、Ninject、Moqを使用しています。 EF4が使用されているサービスクラスの肉になったとき、私はデータコンテキストをインスタンス化します。これは悪いことです。どのようにEF4 + Ninject + Moqに?

私のユニットテストがモックデータコンテキストに対して機能するように、データコンテキストを私のサービスに注入したいと思います。これまでnHibernateでこれをやったことがありますが、EF4でそれを理解することはできません。

誰でも私に実用的なソリューションと例を教えてもらえますか?どうもありがとう!

答えて

4

NHibernate 3.0 cookbookで説明されているように、NHibernateをテストする手法と同様に、インメモリデータベースを使用して(SQLiteを使用して)テストすることをお勧めします。

偽のDbContextを作成する方法については、hereの外観を参照することもできます。

+0

これはおそらく、私が見つけた最高の一例であるが、それは実際にデータベースに触れて、代わりにすべてをモックアップする方法についてだけの話コードを統合する方法をスキップ: http://blogs.msdn.com/ b/adonet/archive/2009/12/17/walkthrough-test-driven-with-entity-framework-4-0.aspx 私はEF4プロジェクトの実例を見いだすことを望んでいました。 dbを作成し、DI、模擬/テストなどを修正する方法 – znelson

+2

この例では、EFのリポジトリパターンを使用しているため、リポジトリの実装を模擬することができます。しかし、ORMを持つリポジトリを使用しないという良い議論があります。 http://stackoverflow.com/questions/5625746/generic-repository-with-ef-4-1-what-is-the-point/5626884#5626884を参照してください。また、統合テストの使用については、http://stackoverflow.com/questions/5609508/asp-net-mvc3-andentity-framework-code-first-architecture/5610685#5610685を参照してください。 – devdigital

+0

レポジトリを使用してインプリメンテーションをモックした場合、エンティティフレームワークをテストしていないため、LINQクエリが本番環境で失敗する可能性があるため、メモリデータベースを使用した統合テストでは実際にEFをテストしています。 – devdigital

0

私の会社では、ローカルの開発データベースとTransactionScopeを使用して変更をロールバックしています。ユニークな副作用は挿入をテストするときに同一性を高めることですが、これは問題ではありません。

利点は、データベースに対して実際のテストがあることです。

電子メールを送信するか、別のサーバーにデータを送信する必要がある場合は、ninject/moqを使用して依存関係注入を使用してIoCに戻ります。

エンティティフレームワークと接続文字列をテストプロジェクトに追加する必要があります。

[TestClass] 
public class NameValueTest 
{ 
    [TestMethod] 
    public void Create() 
    { 
     NameValueController controller = new NameValueController(); 

     using (var ts = new TransactionScope()) 
     { 
      Assert.IsNotNull(controller.Create(new Models.NameValue() 
      { 
       name1 = "1", 
       name2 = "2", 
       name3 = "3", 
       name4 = "4" 
      })); 

      //no complete, automatically abort 
      //ts.Complete(); 
     } 
    } 
} 

私はこれがあなたを助けてくれることを願っています。

関連する問題