2017-01-27 37 views
1

Entity Frameworkを疑似テストするLINQクエリ式(下記)があります。 Entity Framework Testing with a Mocking Framework これは、他のクエリのために動作しますが、コードMock Entity Frameworkの長いLINQクエリ

internal class TestDbAsyncEnumerator<T> : IDbAsyncEnumerator<T> { 
    //... 
    public Task<bool> MoveNextAsync(CancellationToken cancellationToken) 
    { 
     return Task.FromResult(_inner.MoveNext()); 
    } 
    //... 
で、この時点で「_inner」内の値のクエリを実行すると、この

var query = from vwPs in _reportingDbContext.VwAccountNumber 
join ps in _reportingDbContext.PaymentSummary 
    on new 
    { 
     Key1 = vwPs.Id, 
     Key2 = vwPs.AccountNumber, 
     Key3 = true, 
     Key4 = true 
    } 
    equals 
    new 
    { 
     Key1 = ps.Id, 
     Key2 = ps.AccountNumber, 
     Key3 = ps.PaymentDate >= fromDateTime, 
     Key4 = ps.PaymentDate < toDateTime 
    } 
    into viewJoinPayment 
from ps in viewJoinPayment.DefaultIfEmpty() 
join prg in generatedReportIds 
    on ps.PaymentRef equals prg 
    into paymentJoinGenerated 
from prgRow in paymentJoinGenerated.DefaultIfEmpty() 
where vwPs.Id == Id 
select new 
{ 
    vwPs.AccountNumber, 
    Payments = ps, 
    ReportGenerated = prgRow 
}; 

のために動作しません:私は、コードを使用しています模擬する

}

? _inner {System.Linq.Enumerable.WhereSelectEnumerableIterator < <> f__AnonymousType11 < <> f__AnonymousType10 < <> f__AnonymousType9 < <> f__AnonymousType7>、LL.Core.DataAccess.Models.PaymentSummaryEntity>、System.Collections.Generic.IEnumerable>、整数> 、<> f__AnonymousType12>} 電流:ヌル
結果表示:IEnumerableを

を列挙します結果ビューを拡大し、それがMoveNextメソッドを実行したときに()

を例外を取得0

? {System.Collections.ListDictionaryInternal} HRESULT:-2147467261 HELPLINK:ヌル のInnerException:ヌル メッセージ: "_inner.MoveNext() '_inner.MoveNextは()' 'System.NullReferenceException' データのタイプの例外をスローオブジェクト参照がオブジェクト インスタンスに設定されていません。" 出典: "匿名でDynamicMethods議会主催" のStackTrace: "lambda_methodで(閉鎖、<> f__AnonymousType9 2)\r\n at System.Linq.Enumerable.<GroupJoinIterator>d__40 4.MoveNext()\ rを\ nは System.Linq.Enumerable.d__22 3.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext()で" TargetSite: {のInt32 lambda_method(System.Runtime.CompilerServices.Closure、 <> f__AnonymousType9 2[<>f__AnonymousType7 2 [LL.Core.DataAccess.Models.VwAccountNumberEnt ITY、System.Collections.Generic.IEnumerable`1 [LL.Core.DataAccess.Models.PaymentSummaryEntity ]]、LL.Core.DataAccess.Models.PaymentSummaryEntity]))

ここに示唆されているものも含めて DbSet mock, no results while calling ToList secondly

でも、同じ問題が発生します。誰か光をあげてもらえますか?

統合テストによる照会の実装はオプションではありません。これは、ボスがユニットテストレベルで他のすべてのクエリと同様にテストされるためです。

更新日: ありがとう@Eduard Malakhovこれは何かが試されています。 'DefaultIfEmpty'の両方を削除してクエリを実行すると、例外はスローされません。しかし、どのようにDefaultIfEmptyを使って例外を避けることができますか?例外がモックされていないコールで起きていないので、このケースをチェックするためにモッキングコードを変更するにはどうすればよいですか?

var query = from vwPs in _charityReportingDbContext.VwCharityAccountNumber 
join ps in _charityReportingDbContext.PaymentSummary 
    on new 
    { 
     Key1 = vwPs.CharityId, 
     Key2 = vwPs.AccountNumber, 
     Key3 = true, 
     Key4 = true 
    } 
    equals 
    new 
    { 
     Key1 = ps.CharityId, 
     Key2 = ps.AccountNumber, 
     Key3 = ps.PaymentDate >= fromDateTime, 
     Key4 = ps.PaymentDate < toDateTime 
    } 
    into viewJoinPayment 
select new 
{ 
    vwPs.AccountNumber, 
}; 
+1

ただの推測:その倍の声明の中であなたが呼んでいる**それぞれの列挙が空で、後**とNullReferenceExceptionにつながる可能性がある場合はnuill参照につながるDefaultIfEmpty()** * *。これらの呼び出しを削除し、代わりに空のエミュレートを使用するとどうなりますか? –

+0

@EduardMalakhovありがとう、あなたの説明は私の下で私の 'ソリューション'を実装することを決定するのに役立ちました。たぶん、EFを嘲笑することは行く方法ではなく、他の投稿で示唆されているように、メモリ内のデータベースを使うべきです。 – Riga

+1

あなたの上司がこれについての知識豊かな意見を持っていれば幸いです。 *私の考えは、EFを嘲笑することは絶望的だという意見です。このテストは、実際のデータアクセス世界とは根本的に異なる独自の夢の世界を構築します。データベースでSQLとして実行されたLINQクエリは、LINQからオブジェクトへのクエリが行うNREを投げず、重要な違いは1つのみです。 EF関数のテストについては、統合テストを使用してください。残りのユニットテスト。 –

答えて

0

私のハッキー「解決策」(金曜日であり、家に行きたい)。例外を削除しますが、残念なことに正しい結果は得られません。

public Task<bool> MoveNextAsync(CancellationToken cancellationToken){ 
try 
{ 
    return Task.FromResult(_inner.MoveNext()); 
} 
catch (Exception ex) 
{ 
    return Task.FromResult(false); 
}} 
関連する問題