【问题标题】:How do I verify that a collection is correctly fetched from db?如何验证是否从 db 中正确获取了集合?
【发布时间】:2011-07-05 13:46:58
【问题描述】:

我正在尝试为我的存储库编写一个集成测试,但我找不到一个好的方法来断言结果是我想要的。

我有一个包含所有测试数据的静态属性的类 - 项目、用户等。在我的测试设置中,我使用 NHibernate 将所有这些实体插入到我的数据库中(并且我已经能够验证它是否有效- 设置完成后记录就在那里)。

我的存储库(略微简化)是这样做的:

public IEnumerable<MyEntity> GetEntitiesByProjectID(id)
{
    return session.Linq<MyEntity>().Where(e => e.Project.ID == id).ToList();
}

在我的测试中,我尝试断言结果是正确的,如下面的代码示例所示,但由于多种原因,集合不等价 - 主要是引用其他实体的原因被替换为城堡代理 (Castle.Proxies.UserProxy而不是User)。

Assert.AreElementsEqualIgnoreOrder(
    Data.MyEntites.Where(e => e.Project.ID == 1), results)

还有其他一些奇怪的地方 - 例如日期时间的表示方式。在我的 .NET 类型中,日期时间字符串表示为 2011-07-05T14:28:11.5655935+02:00,而来自数据库的字符串表示为 2011-07-05T14:28:11.0000000,即没有时区指示符。

通过检查,我可以验证存储库确实获取了正确的元素,所以我的测试显然是在测试错误的东西。

我在这里做错了什么?

【问题讨论】:

    标签: nhibernate repository integration-testing


    【解决方案1】:

    您确定必须测试数据层吗?我相信 NHIbernate 已经过很好的测试,你必须测试你的服务层并为数据提供模拟。

    如果不是这种情况,请在集成测试期间将延迟加载设置为 false,它应该有助于解决 UserProxy 而不是 User 问题。 对于日期时间问题,请检查数据库中有列的数据类型,有:日期时间、日期时间2、日期...检查您的列是否支持时区

    【讨论】:

    • 关于测试数据层:我尝试使用 Microsoft Moles 模拟 ISession,但未能成功创建 NHibernate.Moles.dll(请参阅 this question 关于它)所以我求助于而是集成测试(虽然我想两者都做,所以模拟 NHibernate 并不能解决这个问题......)。我会看看我是否可以设法将延迟加载设置为 false 并检查我的日期时间列数据类型并返回。
    • 我在这方面做了很多工作,得出以下结论: 1)关闭延迟加载解决了代理问题。谢谢! 2) 我已经尝试了 SQL Server 中所有可用的日期时间类型,但它们都不起作用。我决定使用的一个是 datetime(主要是为了与应用程序的其余部分并发),我发现两个 datetime 实例具有完全相同的 .Ticks 值,因此它们确实代表了相同的点时间。
    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2016-10-21
    • 2023-03-17
    • 2023-03-25
    相关资源
    最近更新 更多