我在下面进行了测试,如果这个模型有任何固定装置,则会失败,其中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
知道为什么吗?我没有在任何其他测试中使用灯具,但也许有一天我会。
答案 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),那么您的测试将因显而易见的原因而失败。
<强>解决方案:强> 在你的灯具文件中注释掉这些空白的记录,或用明智的东西填充它们。