Estoy intentando escribir una prueba unitaria de una implementación de repositorio. El repositorio utiliza RavenDB como una base de datos. Para las pruebas unitarias, me gustaría burlarme de las piezas de RavenDB. Para crear los simulacros (falsificaciones) estoy usando FakeItEasy. Pensé que no habría ningún problema con la burla/falsificación ya que se accede a la API RavenDB a través de las interfaces.Fingir/burlarse de una interfaz da error "no constructor por defecto", ¿cómo puede ser eso?
Sin embargo, tengo un problema al intentar crear una instancia de un simulacro específico. Las partes pertinentes de mi código de prueba de unidad se ve así:
[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);
.
.
.
}
Cuando una instancia de la falsa IRavenQueryable consigo una excepción. Este es el registro del corredor 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)
El "ningún constructor por defecto encontrado" No tiene ningún sentido ya que lo que estoy tratando de falsificar es una interfaz. ¿Alguien tiene alguna sugerencia de cuál podría ser el problema?
Acabo de notar que su mensaje de excepción menciona ** "System.Linq.IQueryable \' 1 [UserDocument] "**, no específicamente' IRavenQueryable '. ¿Está seguro de que la excepción no se produce al crear la instancia de 'IQueryable '? –
Rob
Sí, estoy seguro. Sin embargo, IRavenQueryable amplía la interfaz IQueryable , así que supongo que FakeItEasy falla al intentar falsificar la parte IQueryable si IRavenQueryable ... o algo así. –
¿El público de UserDocument es público? –