Ruby on rails Rails 4:为什么夹具会导致测试失败?
我有下面的测试,如果这个模型有任何固定装置,它会失败,总数未经批准,新总数相等,而不是新总数少一个。 如果我在test_helper.rb中删除加载装置或将其注释掉,它将按预期运行 下面是将批准设置为true的类函数。它确实有效Ruby on rails Rails 4:为什么夹具会导致测试失败?,ruby-on-rails,unit-testing,testing,ruby-on-rails-4,fixtures,Ruby On Rails,Unit Testing,Testing,Ruby On Rails 4,Fixtures,我有下面的测试,如果这个模型有任何固定装置,它会失败,总数未经批准,新总数相等,而不是新总数少一个。 如果我在test_helper.rb中删除加载装置或将其注释掉,它将按预期运行 下面是将批准设置为true的类函数。它确实有效 def InviteRequest.approve_invites(number) inv_reqs = InviteRequest.where("approved = ?", false).first(number) inv_reqs.each do |inv
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
需要“测试助手”
类InviteRequestTest
知道为什么吗?我没有在任何其他测试中使用这些装置,但也许有一天我会使用。当您调用
InviteRequest\save
时,验证可能会失败?尝试将保存
替换为保存编码>并检查测试是否仍然通过。我的固定装置无效,更改它们解决了问题。
但我仍然不确定事情是如何失败的。
我的固定装置是这样的:
one:
email: MyString
two:
email: MyString
one: {}
# column: value
two: {}
# column: value
这将使我的唯一性验证失败,并且不会保存,但我不确定为什么新创建的模型不会将“approved”设置为true,并且仍然会保存,因为它是正确的
不管怎样,把固定装置换成这个固定装置
one:
email: someguy@example.com
two:
email: somegirl@example.com
将rails生成器用于新模型时,将生成夹具文件,如下所示:
one:
email: MyString
two:
email: MyString
one: {}
# column: value
two: {}
# column: value
当您使用fixture运行测试时,rails会尝试创建这两条空记录。如果在迁移过程中存在约束(例如NOTNULL),那么测试将由于明显的原因而失败
解决方案:
在你的fixture文件中注释掉这些空记录,或者用一些合理的东西填充它们。我们不是读心术的人-测试怎么会失败?非常抱歉,内容含糊不清。现在应该更清楚了,什么都没变。看看我的答案。