【问题标题】:nhibernate testing strategy休眠测试策略
【发布时间】:2011-12-05 09:38:51
【问题描述】:

我正在考虑在我的下一个项目中丢弃所有存储库类,并直接在我的服务类中使用ISession。原因是我的存储库类只是倾向于将调用转发到 ORM(即没有真正的逻辑)。

这样做的最大缺点是它使单元测试更加困难,我想知道是否还有其他方法可以在没有数据库的情况下测试我的服务(请不要使用像 sqlite 这样的内存数据库)?模拟ISession 是不是一个坏主意?

还是我应该坚持使用精简的存储库类?

【问题讨论】:

  • 我不明白“没有数据库”的要求;假设你的服务类中有类似的东西:Session.Query<User>.Where(u => u.Domain = domain)。您不想测试这个查询以查看它产生正确的 SQL 和正确的结果吗?你会怎么做?
  • @sJhonny:集成测试而不是单元测试。

标签: c# unit-testing nhibernate


【解决方案1】:

模拟 ISession 是不是一个坏主意?

不,这不是一个坏主意。如果服务类依赖于 ISession,那么您可以执行此操作来测试它们。虽然有一种设计味道,因为您的服务类依赖于 NHibernate,但我想您可以接受。

【讨论】:

  • 请详细说明为什么 ORM 依赖是一种设计味道? (它们不是 WCF 服务类)
  • @jgauffin,这是因为服务层应该与 ORM 无关。它是特定于某些数据库或 ORM(如果您使用任何)的 DAL 层。如果将来您决定更改数据访问策略或 ORM,则无需修改服务层。但是,如果您不打算这样做,正如我所说,您可以在服务层中使用 ISession。
  • @jgauffin,在一个理想的世界中,您希望分离所有可能拥有的 DAL 层,该层特定于某些 ORM 提供者,该提供者实现您的存储库接口,在您的模型上提供简单的原子操作,然后是服务layer 将这些存储库接口作为构造函数参数。
  • @jgauffin - 这当然值得商榷。例如,请参阅此 Oren Eini 博客文章以获取反对存储库的论点:ayende.com/blog/3955/repository-is-the-new-singleton
【解决方案2】:

模拟ISession 可能看起来很容易,但我发现很难进行适当的模拟。特别是如果使用 LINQ 扩展方法。

我会坚持使用存储库。与ISession 等通用接口相比,存储库方法的预期更容易理解。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2015-10-31
    • 2020-01-30
    • 2020-10-05
    相关资源
    最近更新 更多