在使用Rails MVC之后,它让我想到了ASP.Net。我之前使用过Rails,但有点生疏。ASP.Net MVC教程重新注释了使用存储库模式隐藏数据层的实现。这为单元测试提供了简单的依赖注入,并很好地将控制器与模型实现解耦。
我记得Rails的控制器直接使用Active Record对象,单元测试使用测试数据库,可以很容易地设置和拆除。这解决了换出进行单元测试的需要,但在控制器中公开如此多的ActiveRecord代码似乎仍然不是一个好主意。
所以我的问题是,这里最新的最佳实践是什么?真实的(不是模拟的)数据库仍然用于单元测试吗?Rails开发人员是直接调用ActiveRecord,还是抽象调用?
发布于 2009-11-04 18:51:39
我想知道,ActiveRecord真的构成了“数据层”吗?毕竟,它的目的是抽象(在相当合理的程度上)实际的交互存储。如果我有一个继承自ActiveRecord::Base的模型,并在控制器中引用该模型,我是否真的与数据层交互?
看一下Repository Pattern的简要描述,我会说find_by_的方法已经为您提供了它所描述的大部分内容,这很好,不是吗?好的,抽象层是漏洞百出的(人们可以更慷慨地说“实用”),因为如果需要,我们可以更接近金属,例如find_by_sql将很明显地表明,我们正在处理某种类型的关系数据库。
我建议永远不要(或者我应该说“很少而且不是没有极端的理由”-使用绝对的代码总是很棘手的),把代码放在控制器中,这样就可以推断正在使用的数据平台。所有这些都应该放到模型中去-- named_scope在这里非常有用。对于复杂的结果,可以考虑使用"presentation“对象作为接口(Struct和我个人最喜欢的OpenStruct在这里非常有用)。
虽然ActiveRecord是事实上的标准,但考虑到它与Rails一起安装,它并不是唯一的游戏。对于非SQL数据库,需要一些不同的东西,但即使在SQL域中也有Datamapper (它是基于eponymous PoEAA pattern的吗?)
在Rails3.0中,像Yehuda这样的ORM将变得容易得多,男孩们可以拆卸和清理接口。
发布于 2009-11-04 07:24:52
我的经验是,Ruby on Rails与ActiveRecord集成得如此紧密(在大多数情况下,它几乎可以变得完全透明),以至于开发人员经常在没有任何抽象的情况下使用它。
要记住的是,存储库模式和活动记录模式都是在Patterns of Enterprise Architecture by Martin Fowler中建议的(如果您还没有读过,yet...you应该这样做)。活动记录紧密集成在Rails中。Microsoft并不会将您与pattern...so捆绑在一起,大多数开发人员都采用了.NET模式。
发布于 2009-11-05 16:02:20
无论哪种方式,你都可以做到。大多数情况下,编写Rails功能测试的目的都是为了访问数据库,正如您所描述的那样,在数据库中,数据是从fixture填充的。
但模拟服务层调用的情况并不少见,例如:
User.expects(:find_by_id).with("1").returns(u);
get :show, :id=>"1"..。或者类似的东西。事实上,我一直都在这样做,我控制着模型对象(或者也可以把它模仿出来)。
https://stackoverflow.com/questions/1670785
复制相似问题