如何在Rspec功能规范中测试使用父记录的回调



我有一个功能规范来创建orderorder有这样的回调:

class Order
belongs_to :site
before_validation :add_call_number
def add_call_number
self.call_number = self.site.call_number_start
end
end

在规范中,我在call_number_start上得到了一个NoMethod错误,因为self.site不存在。

我发现我在操作之前在Rspec中创建的Site根本不存在。换句话说。。。

require 'rails_helper'
describe "create successfully", type: :feature, js: true do
before do
@site = create(:site)
visit "/orders"
.... # various actions to build an order using the page's form
puts ">>>>>"
puts "site in before action: #{Site.all.size}"
find("#checkoutModal #submit").click()
sleep(1)
end
it "should create" do
expect(Order.all.size).to equal(1)
expect(Order.last.call_number).to equal(@site.call_number_start)
end
end
# controller action that #submit POSTs to
def create
puts ">>>>>"
puts "site in controller create: #{Site.all.size}"
puts ">>>"
puts "site_id from order_params: #{order_params[:site_id]}"
@order = Order.new(order_params)
@order.save if @order.valid?
end
def order_params
params.require(:order).permit(:site_id)
end
# puts output:
>>>>>
site in before action: 1
>>>>>
site in controller create: 0
>>>
site_id from order_params: 1

我认为这是一个数据库清理问题,所以我非常学究地手动将其设置为truncation方法,如下所示:

# rails_helper.rb
Rspec.configure do |config|
config.use_transactional_fixtures = false
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each, truncate: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end

如何正确测试此回调?

您创建了一个站点,但没有在控制器中对其进行排序。

站点是否来自控制器中的order_params?然后在控制器中找出站点不可用的原因。

该网站是否与订单相关?然后需要创建订单网站:

FactoryBot.create(:site, order: order)

最新更新