"No persister for 'Class'" 使用 FakeItEasy 测试 Fluent NHibernate 时出错

"No persister for 'Class'" error when testing Fluent NHibernate with FakeItEasy

我正在编写一些持久性测试,但收到一个错误,即 NHibernate 似乎无法使用 FakeItEasy 的假货。具体错误是:

No persister for: Castle.Proxies.FacilityProxy

如果我像下面这样写测试,它会工作正常并通过

    [Test]
    public void CanCorrectlyCreateFacilityTable()
    {
        new PersistenceSpecification<Facility>(session, new DataEqualityComparer())
            .CheckProperty(f => f.Id, 1)
            .CheckProperty(f => f.Name, _facility.Name)
            .CheckReference(f => f.Owner, new Client())
            .VerifyTheMappings();
    }

但是,如果我创建一个假的:

        IClient _client;
        _client = A.Fake<Client>();
        A.CallTo(() => _client.Name).Returns("Preston");

并将其传递给测试 - 它似乎因上述错误而失败:

    [Test]
    public void CanCorrectlyCreateFacilityTable()
    {
        new PersistenceSpecification<Facility>(session, new DataEqualityComparer())
            .CheckProperty(f => f.Id, 1)
            .CheckProperty(f => f.Name, _facility.Name)
            .CheckReference(f => f.Owner, _client)
            .VerifyTheMappings();
    }

有谁知道我这边是否有解决方法或可能的错误?

我在这里做了一些研究,但似乎找不到已经问过的这个问题。大多数人似乎都关心 FakeItEasy 的配置或 NHibernate 的配置——这似乎不是问题所在: Can I sensibly mock this NHibernate query?

我不是 NHibernate 用户,所以可能帮不上什么忙。您可能已经知道看到此行为的原因是 FakeItEasy 通过(在此过程中使用 Castle.Core 的 DynamicProxy class)创建一个全新的 class 来扩展伪造的class(或实现伪造的接口)。

你没有提供 Client class 的定义,但我猜它上面的某些成员是 Facility 类型的,所以当... 属性(我猜)被访问是为了持久化对象,returned 值是 FacilityProxy 类型,NHibernate 不知道如何处理它。

在我看来,Can I sensibly mock this NHibernate query? 中接受的答案具有正确的想法:使用您想要保留的实际类型的对象进行测试。

如果这让人难以接受,我想我唯一可以建议的是:

  1. Facility 类型的 属性(同样,我假设 属性)配置为 return 实际的 Facility(并且可能这样做是为了其他成员的分类)或
  2. 教 NHibernate FacilityProxy,尽管这可能很难。我不知道 NHibernate,但由于您在编译时无法访问 class,因此它可能很棘手