c# - 伪造/模拟接口(interface)会出现 "no default constructor"错误,这怎么可能?

标签 c# mocking ravendb xunit.net fakeiteasy

我正在尝试编写存储库实现的单元测试。该存储库使用 RavenDB 作为数据库。对于单元测试,我想模拟 RavenDB 部分。为了创建模拟(假货),我正在使用 FakeItEasy。我认为模拟/伪造不会有任何问题,因为 RavenDB API 是通过接口(interface)访问的。

但是,在尝试实例化特定模拟时,我确实遇到了问题。我的单元测试代码的相关部分如下所示:

[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 runner 的日志:

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)

“未找到默认构造函数”没有任何意义,因为我试图伪造的是一个接口(interface)。有没有人建议可能是什么问题?

最佳答案

您是正确的,异常消息没有任何意义,这是一个错误。如果您可以提供一个重现错误的 VS 解决方案并在此处提交问题,那就太好了:https://github.com/patrik-hagne/FakeItEasy/

错误在于使用了错误的异常消息,但是一定有什么错误导致虚假创建出错。 “UserDocument”类型是否公开?如果它是内部的,并且您已经通过使用 InternalsVisibleToAttribute 为您的测试项目提供了访问权限,您还必须为代理生成库提供访问权限:https://fakeiteasy.readthedocs.io/en/stable/how-to-fake-internal-types/#how-to-fake-internal-friend-in-vb-types .

关于c# - 伪造/模拟接口(interface)会出现 "no default constructor"错误,这怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559354/

相关文章:

c# - 在 RavenDB 中插入 List<T> 异常

C# 将任何字符串转换为安全的跨平台文件名?

java - RavenDB 查询返回 null

c# - 是否可以在没有 "APIPassword"的情况下使用 PayPal API 接受付款

java - 使用 Mockito 模拟日期对象

PHPUnit - 我认为我不能使用模拟来测试依赖项注入(inject)容器是否正确?

c# - 如何在单元测试中模拟 DateTime.Now?

nosql - 如何在文档数据库模型中对 "reference data"建模?

c# - richtextbox 到字符串

c# - switch/case 到策略模式