【问题标题】:"No persister for 'Class'" error when testing Fluent NHibernate with FakeItEasy使用 FakeItEasy 测试 Fluent NHibernate 时出现“‘类’没有持久性”错误
【发布时间】:2016-08-09 23:19:56
【问题描述】:

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

没有持久性: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 的配置——这似乎不是问题: How do I test extension method of Nhibernate which does not return the value even after specifying return in fakeiteasy? Can I sensibly mock this NHibernate query?

【问题讨论】:

  • 我已经有一段时间没有使用PersistenceSpecification 测试了,但是如果我没记错的话,确保与数据库的集成设置正确不是重点吗?如果是这样,您为什么需要伪造/模拟被测实体?
  • @AndrewWhitaker 类中的一些属性我更愿意保持受保护而不是公开。模拟班级似乎是更优雅的解决方案,但根据布莱尔在下面的回答,我认为我必须只使用班级本身。感谢您的帮助!

标签: c# unit-testing nhibernate fluent-nhibernate fakeiteasy


【解决方案1】:

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

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

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

如果这不好吃,我想我能建议的唯一事情是:

  1. 配置Facility-typed 属性(同样,我假设一个属性)以返回一个实际的Facility(并且可能为其他成员执行此操作),或者
  2. 教NHibernate 关于FacilityProxy,虽然这可能很难。我不知道 NHibernate,但是由于您在编译时无权访问该类,因此可能会很棘手

【讨论】:

  • 感谢@blairconrad - 使用常规类不一定不好吃,我只是认为在这种情况下使用模拟会更优雅。我认为 Fake It Easy 可能包含一些我不知道的其他行为,但我可以更改测试以改用“真实”对象。感谢您的帮助!
  • 没问题。我希望它能成功。虽然当“真实”对象难以使用时,模拟对象可能很有用,但总的来说,我建议尽可能使用“真实”对象。您可以更好地了解生产系统的实际行为方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
相关资源
最近更新 更多