リポジトリ実装の単体テストを作成しようとしています。リポジトリは RavenDB をデータベースとして使用します。単体テストのために、RavenDB の部分をモックしたいと思います。モック (偽物) を作成するために、FakeItEasy を使用しています。RavenDB API はインターフェイスを介してアクセスされるため、モッキング/フェイクに問題はないと考えました。
ただし、特定のモックをインスタンス化しようとすると問題が発生します。単体テスト コードの関連部分は次のようになります。
[Fact]
public void Test() {
UserDocument doc = ...;
IQueryable<UserDocument> where = A.Fake<IQueryable<UserDocument>>();
A.CallTo(() => where.First()).Returns(doc);
IRavenQueryable<UserDocument> query = A.Fake<IRavenQueryable<UserDocument>>();
IDocumentSession session = A.Fake<IDocumentSession>();
A.CallTo(() => session.Query<UserDocument>()).Returns(query);
IDocumentStore store = A.Fake<IDocumentStore>();
A.CallTo(() => store.OpenSession()).Returns(session);
.
.
.
}
IRavenQueryable 偽物をインスタンス化すると、例外が発生します。これは、Xunit.net ランナーからのログです。
UnitTest.Test : FakeItEasy.Core.FakeCreationException :
Failed to create fake of type "System.Linq.IQueryable`1[UserDocument]".
Below is a list of reasons for failure per attempted constructor:
No constructor arguments failed:
No default constructor was found on the type System.Linq.IQueryable`1[UserDocument].
Stack Trace:
vid FakeItEasy.Core.DefaultExceptionThrower.ThrowFailedToGenerateProxyWithResolvedConstructors(Type typeOfFake, String reasonForFailureOfUnspecifiedConstructor, IEnumerable`1 resolvedConstructors)
vid FakeItEasy.Creation.FakeObjectCreator.TryCreateFakeWithDummyArgumentsForConstructor(Type typeOfFake, FakeOptions fakeOptions, IDummyValueCreationSession session, String failReasonForDefaultConstructor, Boolean throwOnFailure)
vid FakeItEasy.Creation.FakeObjectCreator.CreateFake(Type typeOfFake, FakeOptions fakeOptions, IDummyValueCreationSession session, Boolean throwOnFailure)
vid FakeItEasy.Creation.DefaultFakeAndDummyManager.CreateFake(Type typeOfFake, FakeOptions options)
vid FakeItEasy.Creation.DefaultFakeCreatorFacade.CreateFake[T](Action`1 options)
私が偽造しようとしているのはインターフェースであるため、「デフォルトのコンストラクターが見つかりません」は意味がありません。何が問題なのか誰か提案がありますか?