3

FakeItEasy のこの投稿に似た例を誰かが持っているかどうか疑問に思っていました(元の投稿はこちらです。正しいセットアップを見つけようとしましたが、正しく設定できませんでした。オンラインで例を見つけることができませんでした。教え始めています。自分で単体テストを行い、FakeItEasy を使用することにしました.これまでの私のプロジェクトはすべてエンティティ フレームワークを使用し、Repository/UOW パターンは使用していません.これは、DbSet と DbContext が私の小規模なアプリケーションには十分であると考えているためです. EFとユニットテストですが、私はまだこれを理解したいと思っています.私が得たエラーは

System.NotImplementedException: メンバー 'IQueryable.Provider' は型 'DbSet 1Proxy' which inherits from 'DbSet1' に実装されていません。'DbSet`1' のテスト ダブルは、使用されるメソッドとプロパティの実装を提供する必要があります。

どの方向も非常に役立ちます。ありがとうございました。

var data = new List<Request> 
{ 
request1, 
request2, 
request3
}.AsQueryable();

var fakeDbSet = A.Fake<DbSet<Request>>();

A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Provider).Returns(data.Provider);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Expression).Returns(data.Expression);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).ElementType).Returns(data.ElementType);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).GetEnumerator()).Returns(data.GetEnumerator());

var fakeContext = A.Fake<RequestPortalContext>();
A.CallTo(() => fakeContext.Requests).Returns(fakeDbSet);

var service = new RequestReadService(fakeContext);
var requests = service.GetAllRequests();

Assert.AreEqual(3, requests.Count);
Assert.AreEqual("Test1", requests[0].Name);
Assert.AreEqual("Test2", requests[1].Name);
Assert.AreEqual("Test3", requests[2].Name);
4

1 に答える 1

7

私は EntityFramework にまったく精通しておらず、NotImplementedException のスタック トレースがないため、何が起こっているのかはっきりとは言えませんが、私の推測は次のとおりです。

行ではなく、を定義する行serviceまたは呼び出す行のいずれかから例外が発生しています。GetAllRequestsA.Fake<DbSet<Request>>()

の内部のように思えます (それはあなたのクラスですか、他の場所で見つけることができませんか?) またはそれが呼び出す何かは、実装しているDbSetRequestReadServiceにも依存していますIQueryable.Provider。今。なぜそれがまだ存在しないのかはわかりません。おそらく、それを捨てるのは明示的な実装です。私が提案できる最善の方法は(EF6の知識が完全に不足しているため、これを試したことはありません)、インターフェイスを偽物に明示的に追加してみてください:

A.Fake<DbSet<Request>>(builder => 
                         builder.Implements(typeof (IQueryable<Result>)));

それを入力した後、 FakeItEasy issue 31を読みましたが、これが当てはまるのではないかと心配しているため、私の考えはうまくいかないかもしれません. それではまた、気が向いたらやってみてください。長くはかからないかもしれません。

あるいは、短期的には、他にどのような回避策を提案すればよいかわかりません。おそらく、それ自体DbSetを偽造するのではなく、実装するインターフェースのいくつかを偽造しているのでしょうか?DbSet

更新: この種のことについて別の質問があり、実際に EF6 を取得して試してみた後、ここで根本的な問題と思われるものを追跡するために問題 477を作成しました。

于 2014-03-17T15:32:26.657 に答える