Rails 3工厂与简单实例化

时间:2011-08-28 08:43:18

标签: ruby-on-rails ruby-on-rails-3 factory

有人可以解释为什么工厂比测试期间的简单实例更有用吗?更清楚的是,我没有看到:

之间的区别
before(:each) do
  @attr = {
    :name => "Example User",
    :email => "user@example.com",
    :password => "foobar",
    :password_confirmation => "foobar"
  }
end

it "should create a new instance given valid attributes" do
  User.create!(@attr)
end

和这个

before(:each) do
  @user = Factory(:user)
end

有以下工厂:

Factory.define :user do |user|
  user.name                  "Michael Hartl"
  user.email                 "mhartl@example.com"
  user.password              "foobar"
  user.password_confirmation "foobar"
end

2 个答案:

答案 0 :(得分:5)

您的应用越大,您从工厂获得的收益就越多。

您的解决方案非常适合2-3种型号。但是,假设您有一个文章模型,您需要有效的用户来测试内容。现在您有2个文件,您可以在其中为用户定义@attr。现在想象有更多需要用户的模型,比如评论,角色等等。它变得混乱。

使用工厂更方便。好处是您可以定义多个默认原型。像管理员用户,普通用户,未注册用户等。

此外,代码是DRY,因此如果添加新的必填字段,您可以将其添加到工厂一次,然后就完成了。

所以答案是:基本上它们是相同的,但是你的应用越大,你需要一种管理所有原型的方法。

答案 1 :(得分:4)

因为它可以让您在一个地方拥有所有必需的变量和关联。

此外,您可以轻松创建存根或简单地提取属性而无需其他代码。

如果您有多个测试文件,那么您的兴趣会更清晰,因为您希望将代码保留为DRY。

旁注:

您应该使用'let'而不是每次创建实例变量