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__223.MoveNext()\r\n at System.Linq.Enumerable.WhereSelectEnumerableIterator
2.MoveNext()で" TargetSite: {のInt32 lambda_method(System.Runtime.CompilerServices.Closure、 <> f__AnonymousType92[<>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,
};
ただの推測:その倍の声明の中であなたが呼んでいる**それぞれの列挙が空で、後**とNullReferenceExceptionにつながる可能性がある場合はnuill参照につながるDefaultIfEmpty()** * *。これらの呼び出しを削除し、代わりに空のエミュレートを使用するとどうなりますか? –
@EduardMalakhovありがとう、あなたの説明は私の下で私の 'ソリューション'を実装することを決定するのに役立ちました。たぶん、EFを嘲笑することは行く方法ではなく、他の投稿で示唆されているように、メモリ内のデータベースを使うべきです。 – Riga
あなたの上司がこれについての知識豊かな意見を持っていれば幸いです。 *私の考えは、EFを嘲笑することは絶望的だという意見です。このテストは、実際のデータアクセス世界とは根本的に異なる独自の夢の世界を構築します。データベースでSQLとして実行されたLINQクエリは、LINQからオブジェクトへのクエリが行うNREを投げず、重要な違いは1つのみです。 EF関数のテストについては、統合テストを使用してください。残りのユニットテスト。 –