2016-12-27 4 views
1

JustMockとEntity Frameworkを使用して、サービスの単体テストを作成しようとしています。サービスでは、私はこの方法があります:JustMockでEntity Frameworkクラスを別のクラスに偽装しよう

List<Log> GetLogType(string type) 
{ 
    using (var db = new LogContext()) 
    { 
     return db.Logs.Where(x => x.Type == type).ToList(); 
    } 
} 

をそして私は、テストを持っている:

[TestMethod] 
public void GetLogTypeTest() 
{ 
    IList<Log> logs = new List<Log> 
    { 
     new Log() { 
      Id = 1, 
      Type = "Debug", 
      Message = "Test Message" 
     } 
    }; 

    var logContext = Mock.Create<LogContext>(Constructor.Mocked).PrepareMock(); 
    logContext.Logs.Bind(logs); 

    var service = new LogService(); 

    var debugs = service.GetLogType("Debug"); 

    Assert.AreEqual(1, debugs.Count()); 
} 

にはどうすればサービスが私の嘲笑コンテキストを使用するのですか?今すぐデータベースに接続しようとしているため、エラーが発生しています。

答えて

2

理由は

これはJustMockで起こっていません。あなたのメソッドにLogContextという新しいインスタンスを作成したことが原因です。あなたのメソッドは、常に新しいサービスインスタンスを作成し、実際のデータベースとの接続を確立するため、ユニットテスト可能ではありません。 C#に適したいくつかの依存性注入フレームワークがあります。ご興味のある方はUnityをご覧ください。あなたは依存性注入を使用して、クラスにあなたのサービスを注入する必要がありTHIS

を修正するには

。その場合、データベースへの接続を避けることができます。あなたの方法は次のようになります。

List<Log> GetLogType(string type) 
{ 
    return _logContext.Logs.Where(x => x.Type == type).ToList();  
} 

_logContextトラフコンストラクタを注入されLogContextタイプのグローバル変数です。

あなたはそれを模擬して模擬トラフのコンストラクタを渡すことができます。クラスの

例になります

public class LogService 
{ 
    private readonly LogContext _logContext; 

    public LogService(LogContext logContext) 
    { 
     _logContext = logContext; 
    } 

    List<Log> GetLogType(string type) 
    { 
     return _logContext.Logs.Where(x => x.Type == type).ToList();  
    } 
} 

今、あなたは、次のようにテストケースを作成することができます。

[TestMethod] 
public void GetLogTypeTest() 
{ 
    IList<Log> logs = new List<Log> 
    { 
     new Log() { 
      Id = 1, 
      Type = "Debug", 
      Message = "Test Message" 
     } 
    }; 

    var logContext = Mock.Create<LogContext>(Constructor.Mocked).PrepareMock(); 
    logContext.Logs.Bind(logs); 

    var service = new LogService(logContext); 

    var debugs = service.GetLogType("Debug"); 

    Assert.AreEqual(1, debugs.Count()); 
} 

私がやったことに注意してください。私はあなたのようにserviceインスタンスを作成しましたが、実際のサービストラフコンストラクタの模擬インスタンスを挿入しました。模擬されたインスタンスは決してデータベースに接続せず、設定で提供したデータを返します。

+0

ありがとう、私は間違ってそれに近づいていたと思います。多くのリファクタリングが必要ですが、これはうまくいくでしょう。 – RossD

+0

問題ありません。依存性注入がなければ、素晴らしい単体テストを実行することはできません。 DIを使いたくない場合でも、統合テストを実行できますが、その場合はテストデータベースを作成し、テストプロジェクトのapp.config内のそのDBを指すように接続文字列を設定する必要があります。 – kat1330

関連する問題