Rails 4:为什么灯具会使测试失败?

时间:2013-07-10 23:48:13

标签: ruby-on-rails unit-testing testing ruby-on-rails-4 fixtures

我在下面进行了测试,如果这个模型有任何固定装置,则会失败,其中total_unapproved和new_total相等而不是new_total少一个。 如果我删除在test_helper.rb中加载灯具或将它们注释掉,就会按照我的预期运行。

这是将批准设置为true的类函数。它确实有效。

def InviteRequest.approve_invites(number)
  inv_reqs = InviteRequest.where("approved = ?", false).first(number)
  inv_reqs.each do |inv_req|
    inv_req.approved = true
    inv_req.save
    inv_req.send_approved_email
  end
end

这是调用上述功能的测试。

require 'test_helper'

class InviteRequestTest < ActiveSupport::TestCase

  test "class method approve_invites(number) should approve 'number' InviteRequests" do
    # ensure there is at least one instance
    inv_req = InviteRequest.create(email: "hobojoe@test.com")

    # set all InviteRequests.approved to false
    InviteRequest.all.each {|r| r.approved = false; r.save}
    total_unapproved = InviteRequest.where("approved = ?", false).count
    Rails.logger.info "\nUnapproved Before: #{total_unapproved}"
    InviteRequest.approve_invites(1)
    new_total = InviteRequest.where("approved = ?", false).count
    Rails.logger.info "Unapproved After: #{new_total}\n"

    assert_equal total_unapproved - 1, new_total
  end 
end

知道为什么吗?我没有在任何其他测试中使用灯具,但也许有一天我会。

3 个答案:

答案 0 :(得分:1)

我的灯具无效,更改它们解决了问题。 我仍然不确定事情是如何失败的。 我的装置看起来像这样:

one:
  email: MyString

two:
  email: MyString

这将失败我的唯一性验证而不是保存,但我不确定为什么新创建的模型不会将'approved'设置为true并且仍然保存,因为它是正确的。

无论如何,将灯具更改为固定的东西。

one:
  email: someguy@example.com

two:
  email: somegirl@example.com

答案 1 :(得分:0)

当你打电话给InviteRequest#save时,验证可能会失败吗?尝试将save替换为save!并检查测试是否仍然通过。

答案 2 :(得分:0)

当您为新模型使用rails生成器时,生成fixture文件,如下所示:

one: {}
# column: value
two: {}
#  column: value

当您使用灯具运行测试时,rails会尝试创建此2个空记录。如果您在迁移中有约束(例如非null),那么您的测试将因显而易见的原因而失败。

<强>解决方案: 在你的灯具文件中注释掉这些空白的记录,或用明智的东西填充它们。