Rails 7 个系统测试因模型回调而出错,我该如何解决?
Rails 7 system tests gives an error because of model callback, how can i fix this?
我正在尝试测试我的表单行为,但是当我单击“保存”时,回调会抛出如下错误。
如果我评论下面的代码,一切正常。在这里我不想测试回调,但它阻止我成功测试行为。
我该怎么做才能解决这个问题。
#before_create :assign_depth
#before_save :assign_depth
fond.yml |夹具
first:
name: At vero eos et accusamus
explanation: some explanation
parent:
second:
name: laborum et dolorum fuga. Et
explanation: some explanation
parent: first
fond.rb 型号
class Fond < ApplicationRecord
...
before_create :assign_depth
before_save :assign_depth
belongs_to :parent, class_name: "Fond", optional: true
has_many :children, class_name: "Fond", foreign_key: "parent_id", dependent: :nullify
private
def assign_depth
self.depth = (self.parent.present? ? parent.depth + 1 : 0)
end
end
测试
require "application_system_test_case"
class FondsTest < ApplicationSystemTestCase
setup do
login_as users(:admin)
@fond_related = fonds(:second)
end
test "should create related fond" do
visit fonds_url
click_on "New fond"
fill_in "Name", with: "Test Test Test"
fill_in "Explanation", with: @fond_related.explanation
first(:xpath, "/html/body/div[2]/div[2]/form/div[3]/div").click()
find('div.item', text: @fond_related.name).click()
click_on ("Fond Kaydet")
assert_text "Fond was successfully created"
end
end
测试结果
E
Error:
FondsTest#test_should_create_related_fond:
NoMethodError: undefined method `+' for nil:NilClass
app/models/fond.rb:29:in `assign_depth'
app/controllers/fonds_controller.rb:29:in `block in create'
app/controllers/fonds_controller.rb:28:in `create'
在回调中,您正在检查 parent
是否存在,但 parent.depth
是 nil
而 nil+1
是错误的。系统测试是全栈测试,这里没有跳过(如果我是这里的管理员,我现在正在查看错误 500)。
你的测试正在做它应该做的事情,检查行为并找到错误。您已成功找到一个。您应该在数据库中将默认的 depth
设置为 0,并且将 null: false
设置为 return nil。迁移应如下所示:
def change
create_table :fonds do |t|
t.integer :depth, default: 0, null: false
end
end
更改现有列
def change
change_column_default(:fonds, :depth, from: nil, to: 0)
change_column_null(:fonds, :depth, false)
end
任何低于此值的值都意味着您每次要操作它时都必须检查深度。您还应该在 Fond
模型
中进行验证
validates :depth, presence: true, numericality: true
我正在尝试测试我的表单行为,但是当我单击“保存”时,回调会抛出如下错误。 如果我评论下面的代码,一切正常。在这里我不想测试回调,但它阻止我成功测试行为。
我该怎么做才能解决这个问题。
#before_create :assign_depth
#before_save :assign_depth
fond.yml |夹具
first:
name: At vero eos et accusamus
explanation: some explanation
parent:
second:
name: laborum et dolorum fuga. Et
explanation: some explanation
parent: first
fond.rb 型号
class Fond < ApplicationRecord
...
before_create :assign_depth
before_save :assign_depth
belongs_to :parent, class_name: "Fond", optional: true
has_many :children, class_name: "Fond", foreign_key: "parent_id", dependent: :nullify
private
def assign_depth
self.depth = (self.parent.present? ? parent.depth + 1 : 0)
end
end
测试
require "application_system_test_case"
class FondsTest < ApplicationSystemTestCase
setup do
login_as users(:admin)
@fond_related = fonds(:second)
end
test "should create related fond" do
visit fonds_url
click_on "New fond"
fill_in "Name", with: "Test Test Test"
fill_in "Explanation", with: @fond_related.explanation
first(:xpath, "/html/body/div[2]/div[2]/form/div[3]/div").click()
find('div.item', text: @fond_related.name).click()
click_on ("Fond Kaydet")
assert_text "Fond was successfully created"
end
end
测试结果
E
Error:
FondsTest#test_should_create_related_fond:
NoMethodError: undefined method `+' for nil:NilClass
app/models/fond.rb:29:in `assign_depth'
app/controllers/fonds_controller.rb:29:in `block in create'
app/controllers/fonds_controller.rb:28:in `create'
在回调中,您正在检查 parent
是否存在,但 parent.depth
是 nil
而 nil+1
是错误的。系统测试是全栈测试,这里没有跳过(如果我是这里的管理员,我现在正在查看错误 500)。
你的测试正在做它应该做的事情,检查行为并找到错误。您已成功找到一个。您应该在数据库中将默认的 depth
设置为 0,并且将 null: false
设置为 return nil。迁移应如下所示:
def change
create_table :fonds do |t|
t.integer :depth, default: 0, null: false
end
end
更改现有列
def change
change_column_default(:fonds, :depth, from: nil, to: 0)
change_column_null(:fonds, :depth, false)
end
任何低于此值的值都意味着您每次要操作它时都必须检查深度。您还应该在 Fond
模型
validates :depth, presence: true, numericality: true