2009-09-10 7 views
1

TDD、ASP.NET MVC、LinqToSqlの新機能です。 LinqToSqlを使用してストアドプロシージャからデータを取得するリポジトリのテストを作成しようとしています。Moqを使用したユニットテストLinqを使用したスト​​アドプロシージャへのコード

これは、試験されているリポジトリの方法である:

public int GetResponseCount(int campaignId) 
{ 
    var results = (new MyDBDataContext()).GetResponseCountById(campaignId); 
    foreach (GetResponseCountByIdResult result in results) 
    { 
return (result.ResponseCount != null) ? result.ResponseCount.Value : 0; 
    } 
    return 0; 
} 

これはテストのコードである:

var myDBDataContext = new Mock<MyDBDataContext>(); 
var result = new Mock<ISingleResult<GetResponseCountByIdResult>>().Object(); 
myDBDataContext.Setup(x => x.GetResponseCountById(It.IsAny<int>())).Returns(result).Verifiable(); 
... 
... 

2つの質問がある:

1)sored手順は、単一のを返します整数結果。しかし、LinqToSqlの応答をループして値を取得する必要があります。それは理想的ではない。それを行うより良い方法はありますか?

2)テスト中のコードはコンパイルされません。コンパイラが言う - 非呼び出し可能なメンバ'Moq.Mock<System.Data.Linq.ISingleResult<GetResponseCountByResult>>.Object' cannot be used like a method. 私のリポジトリメソッドがLinqToSqlの正しいメソッドを呼び出すことを確認するためにテストを書く方法はありますか?

多くのありがとうございます!

答えて

1

私はあなたのDataContextへのアクセスをカプセル化して、ユニットテストのためのアクセスを傍受することができます。このアプローチは、あなたがする必要がある場合は、単一の結果を得るためにあなたのクエリを適応することができます:

public class MyDataAccess{ 
    public X GetMyX(){ 
    using (var ctx = new DataContext()){ 
     return (from x in ctx.TheXs where... select x).FirstOrDefault(); 
    } 
    } 
} 

その方法は、あなたのユニットテストの中にあなた自身の結果を提供し、データコンテキストを嘲笑し、またクエリを適応させることができます結果が1つしかないと確信している場合は、シーケンスから最初の回答を得ることができます。

最高の願い、

アンドリュー

関連する問題