有人可以解释为什么工厂比测试期间的简单实例更有用吗?更清楚的是,我没有看到:
之间的区别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
答案 0 :(得分:5)
您的应用越大,您从工厂获得的收益就越多。
您的解决方案非常适合2-3种型号。但是,假设您有一个文章模型,您需要有效的用户来测试内容。现在您有2个文件,您可以在其中为用户定义@attr。现在想象有更多需要用户的模型,比如评论,角色等等。它变得混乱。
使用工厂更方便。好处是您可以定义多个默认原型。像管理员用户,普通用户,未注册用户等。
此外,代码是DRY,因此如果添加新的必填字段,您可以将其添加到工厂一次,然后就完成了。
所以答案是:基本上它们是相同的,但是你的应用越大,你需要一种管理所有原型的方法。
答案 1 :(得分:4)
因为它可以让您在一个地方拥有所有必需的变量和关联。
此外,您可以轻松创建存根或简单地提取属性而无需其他代码。
如果您有多个测试文件,那么您的兴趣会更清晰,因为您希望将代码保留为DRY。
旁注:
您应该使用'let'而不是每次创建实例变量