【问题标题】:Factory Girl failing Rspec validation tests工厂女孩未通过 Rspec 验证测试
【发布时间】:2012-01-03 05:10:10
【问题描述】:

我一直在努力掌握如何编写测试,但遇到了很多麻烦,因为测试似乎从来没有按照我想要的方式验证。特别是,我一直在尝试使用 Factory Girl 而不是固定装置——正如最近的 Railscasts 和我在网上看到的其他建议所建议的那样——因为它声称有好处,但没有奏效。

例如,这是一个针对用户模型的简单 Rspec 测试,测试以确保存在用户名...

describe User do
  it "should not be valid without a username" do
    user = FactoryGirl.create(:user, :username => "", :password => "secret")
    user.should_not be_valid
  end
end

还有我的 factory.rb 文件,如果有帮助的话……

FactoryGirl.define do
  factory :user do
    sequence(:username) { |n| "registered-#{n}" }
    password "foobar"
  end
end

当我运行“rake spec”时,它会告诉我...

1) User should not be valid without a username
     Failure/Error: user = FactoryGirl.create(:user, :username => "", :password => "secret")
     ActiveRecord::RecordInvalid:
       Validation failed: Username can't be blank

嗯……这就是重点。如果我指定用户不应该是有效的,这个测试不应该真正通过吗?

如果我替换 Factory Girl 行并将测试中的用户设置为 'user = User.new(:username => "", :password => "secret")' 之类的东西,毫无疑问测试通过了。那么为什么工厂女孩不能正常工作呢?

【问题讨论】:

    标签: ruby-on-rails rspec factory-bot


    【解决方案1】:

    你应该像下面这样使用构建:

    user = Factory.build(:user, :username=>"foo")
    

    因为使用您正在使用的方法会尝试创建记录。请参阅docs 了解更多信息。

    【讨论】:

    • 为了放大这一点,如果您使用create,那么它会尝试创建无效记录,抛出适当的异常,并且永远不会到达您的断言所在的下一行。 build 将在内存中构建记录但不保存它,因此您不会得到 RecordInvalid 异常,但 user.valid? 仍将返回 false。
    • 为什么FactoryGirl 没有创建和创建!就像铁轨一样?当您想要测试验证或尝试调试时,这可能会非常烦人。就像在rails中一样,有时你想要一个,有时另一个。有很多疯狂的变通方法可以创建新的创建策略并在定义工厂时指定它,但如果 create 的行为符合人们的预期或至少为您提供一些选项,则所有这些都可以避免。
    • @eagspoo 我从来没有弄清楚 Rails create 有什么用处——一般来说,如果我尝试保存无效记录,我希望 Rails 抛出异常(所以我几乎一直使用create!)。事实上,我几乎总是有 DB 约束,因此无效记录 无法 被保存。这在测试中翻了一番。如果您正在构建无效记录,请使用 build 而不是 create
    • 我在测试失败的状态机转换(由state_event 触发)时遇到了类似的问题。 build + before{ subject.save } 完美运行。
    • @MarnenLaibow-Koser - create 在您希望请求具有幂等性时很有用。例如,假设您想跟踪用户是否查看了某个页面。你可以做PageView.create(user: user)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多