Ruby on rails Rails 4:为什么夹具会导致测试失败?

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

我有下面的测试,如果这个模型有任何固定装置,它会失败,总数未经批准,新总数相等,而不是新总数少一个。 如果我在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
需要“测试助手”
类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文件中注释掉这些空记录,或者用一些合理的东西填充它们。

我们不是读心术的人-测试怎么会失败?非常抱歉,内容含糊不清。现在应该更清楚了,什么都没变。看看我的答案。