我遇到了RSpec的错误,我无法弄清楚为什么会出现这个错误。我使用FactoryBot创建一个扫描,为fsp_name设置一个值。尝试验证first_order时,在验证中以某种方式无法识别此值。
我得到的错误是
Failures:
1) Sweep validates
Failure/Error: validates_presence_of :fsp_from, :fsp_to, :fsp_step, unless: -> (sweep) { sweep.fsp_name.empty? }
NoMethodError:
undefined method `empty?' for nil:NilClass
# ./app/models/sweep.rb:21:in `block in <class:Sweep>'
# ./spec/models/sweep_spec.rb:21:in `block (2 levels) in <top (required)>'
# -e:1:in `<main>'
Finished in 0.8215 seconds (files took 0.37721 seconds to load)
1 example, 1 failure
当我在上次测试之前执行调试器并检查@sweep时,@ sweep.fsp_name存在并返回类似'Voltage'的值。我不明白为什么测试失败了。
RSpec测试:sweep_spec.rb
require 'rails_helper'
include Warden::Test::Helpers
describe Sweep do
def create_sweep
@user = FactoryBot.create(:user)
@group = Group::PRIVATE
@server = FactoryBot.create(:server, user: @user)
@simulation = FactoryBot.create(:simulation, user: @user, group: @group, server: @server)
@sweep = FactoryBot.create(:sweep, simulation: @simulation)
end
it "validates" do
is_expected.to have_many :sweep_points
is_expected.to belong_to :simulation
is_expected.to have_one(:project).through :simulation
is_expected.to belong_to :param_set
create_sweep
is_expected.to validate_numericality_of(:first_disorder).is_greater_than 0
end
end
工厂:sweep.rb
require 'faker'
FactoryBot.define do
factory :sweep do
first_disorder 1
final_disorder 5
fsp_name { Sweep::TESTER_VARIABLES.sample.first }
fsp_from 1
fsp_to 1
fsp_step 1
ssp_name "FLUENCE"
ssp_from 1
ssp_to 1
ssp_step 1
param_set_id 1
state { Faker::Name.last_name }
trait :empty do
end
trait :filled do
param_set { create(:param_set, :filled) }
end
end
end
型号:sweep.rb
Class Sweep < ApplicationRecord
has_many :sweep_points, dependent: :destroy
belongs_to :simulation
has_one :project, through: :simulation
belongs_to :param_set, optional: true
validates_associated :param_set
TESTER_VARIABLES = [['Voltage','VOLTAGE'],['Fluence','FLUENCE'],['Alpha','ALPHA'],['Beta','BETA'],['Fermi level left','FERMI_LEVEL_LEFT'],['Fermi level right','FERMI_LEVEL_RIGHT'],['Seed for RNG','RANDSEED'],['Injection prefactor','INJECTION_PREFACTOR'],['Extraction prefactor','EXTRACTION_PREFACTOR'],['Singlet exciton binding energy','SINGLET_EXCITON_BINDING_ENERGY'],['Triplet exciton binding energy','TRIPLET_EXCITON_BINDING_ENERGY'],['Hole prefactor','HOLE_PREFACTOR'],['Electron prefactor','ELECTRON_PREFACTOR'],['CT-state binding energy','V'],['Minimal number of electrons','MIN_ELECTRONS'],['Minimal number of holes','MIN_HOLES'],['Minimal number of excitons','MIN_EXCITONS']]
VARIABLES = [['Voltage','VOLTAGE']]
validates :first_disorder, numericality: { only_integer: true, greater_than: 0, less_than: 1000 }
validates :final_disorder, numericality: { only_integer: true, greater_than: 0, less_than: 1000 }
validate :first_seq_final
validates_presence_of :fsp_from, :fsp_to, :fsp_step, unless: -> (sweep) { sweep.fsp_name.empty? }
end
答案 0 :(得分:1)
在测试该线程的唯一性时,我遇到了与shoulda-matchers有关的问题。 Rspec validates_uniqueness_of test failing with additional validation errors
我猜测测试是在检查您尚未设置的主题,因此它会自行创建一个扫描对象。此对象不会从工厂机器人生成,因此该字段将为q= {'PRP_CS_VehicleSPeed', 'ASWC_M740_MSI', 'ASWC_M741_MSI'}))
mask = (df[1] == 'WARNING') & df[2].isin(q)
df_mask = df[mask]
# Timestamp Message \
# 6 2018-03-05 10:55:56 438 WARNING ASWC_M740_MSI is without connector
# 8 2018-03-05 10:55:56 438 WARNING PRP_CS_VehicleSPeed is without con...
# Message_Error 0 1 2
# 6 [438, WARNING, ASWC_M740_MSI] 438 WARNING ASWC_M740_MSI
# 8 [438, WARNING, PRP_CS_VehicleSPeed] 438 WARNING PRP_CS_VehicleSPeed
而不是nil
。
尝试在 describe Sweep 中添加:
[]