"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? 中接受的答案具有正确的想法:使用您想要保留的实际类型的对象进行测试。
如果这让人难以接受,我想我唯一可以建议的是:
- 将
Facility
类型的 属性(同样,我假设 属性)配置为 return 实际的 Facility
(并且可能这样做是为了其他成员的分类)或
- 教 NHibernate
FacilityProxy
,尽管这可能很难。我不知道 NHibernate,但由于您在编译时无法访问 class,因此它可能很棘手
我正在编写一些持久性测试,但收到一个错误,即 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 的配置——这似乎不是问题所在:
我不是 NHibernate
用户,所以可能帮不上什么忙。您可能已经知道看到此行为的原因是 FakeItEasy 通过(在此过程中使用 Castle.Core 的 DynamicProxy class)创建一个全新的 class 来扩展伪造的class(或实现伪造的接口)。
你没有提供 Client
class 的定义,但我猜它上面的某些成员是 Facility
类型的,所以当... 属性(我猜)被访问是为了持久化对象,returned 值是 FacilityProxy
类型,NHibernate 不知道如何处理它。
在我看来,Can I sensibly mock this NHibernate query? 中接受的答案具有正确的想法:使用您想要保留的实际类型的对象进行测试。
如果这让人难以接受,我想我唯一可以建议的是:
- 将
Facility
类型的 属性(同样,我假设 属性)配置为 return 实际的Facility
(并且可能这样做是为了其他成员的分类)或 - 教 NHibernate
FacilityProxy
,尽管这可能很难。我不知道 NHibernate,但由于您在编译时无法访问 class,因此它可能很棘手