Как проверить обратный вызов, который использует родительскую запись в спецификации Rspe c - PullRequest
0 голосов
/ 23 марта 2020

У меня есть функция spe c для создания order. У этого order есть обратный вызов, например:

class Order
  belongs_to :site
  before_validation :add_call_number

  def call_number
    self.call_number = self.site.call_number_start
  end
end

В спецификации c я получаю ошибку NoMethod на call_number_start, потому что self.site не существует.

Я обнаружил, что Site, который я создал в Rspe c до того, как действие вообще не существует. Другими словами ...

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

Как я могу правильно проверить этот обратный вызов?

1 Ответ

0 голосов
/ 23 марта 2020

Вы создали сайт, но не отдали его под заказ в контроллере.

Является ли сайт с order_params в контроллере? Затем выясните в контроллере, почему сайт недоступен.

Является ли сайт ассоциацией с заказом? Затем необходимо создать сайт для заказа:

FactoryBot.create(:site, order: order)
...