Ruby on rails Rails 3工厂与简单实例化

Ruby on rails Rails 3工厂与简单实例化,ruby-on-rails,ruby-on-rails-3,factory,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

有人能解释一下为什么在测试过程中工厂比简单的实例化更有用吗?更清楚地说,我看不出以下两者之间的区别:

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

因为它允许您在一个地方拥有所有必需的变量和关联

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

一旦你有了几个测试文件,你的兴趣就会更明显,因为你想保持你的代码干燥

旁注:


你应该使用“let”而不是每次创建一个实例变量,你的应用程序越大,你从工厂获得的好处就越多

您的解决方案适用于2-3款车型。但是假设您有一个文章模型,您需要有效的用户来测试内容。现在您有了两个文件,可以在其中为用户定义@attr。现在想象一下,有更多的模型需要用户,比如评论、角色等等。这会变得很混乱

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

此外,代码是干的,所以如果您添加一个新的必填字段,您可以将它添加到您的工厂一次,您就完成了


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

谢谢你。对我来说,它看起来是一样的,所以我认为它很方便,但因为我是从零开始学习的,所以我想确保我没有遗漏任何东西。塔克斯!