2016-07-18 6 views
0

Я пишу тест контроллера RSpec, и у меня возникла следующая проблема.RSpec Не удалось найти с 'id' =

Взаимосвязь такова, что счета-фактуры принадлежат к Приобретению, а у Покупки есть много счетов-фактур.

Мой контроллер имеет:

class InvoicesController < ApplicationController 
    def index 
    @invoices = Invoice.all 
    end 

    def new 
    @purchase = Purchase.find(params[:purchase]) 
    @invoice = Invoice.new(:purchase_id => params[:purchase]) 
    end 

Моя фабрика имеет:

FactoryGirl.define do 
    factory :invoice do |f| 
    sequence(:id) { |number| number } 
    f.purchase_id {rand(1..30)} 
    f.number { FFaker::String.from_regexp(/\A[A-Za-z0-9]+\z/) } 
    f.terms { FFaker::String.from_regexp(/\A[A-Za-z0-9\s]+\z/) } 
    f.currency { FFaker::String.from_regexp(/\A[A-Z]+\z/) } 
    f.total_due {'25000.00'} 
    f.current_balance {'12500.00'} 
    f.due_date { FFaker::Time.date } 
    f.notes { FFaker::HipsterIpsum.paragraph } 
    f.status {[:open, :paid, :canceled].sample} 
    purchase 
    end 

    factory :invalid_invoice, parent: :invoice do |f| 
    f.status nil 
    end 
end 

Мой контроллер спецификации (только проблематичная часть) имеет:

describe "GET new" do 
    it "assigns a new invoice to @invoice" do 
     invoice = FactoryGirl.create(:invoice) 
     get :new 
     expect(assigns(:invoice)).to_not eq(invoice) 
    end 

    it "renders the :new template" do 
     get :new 
     expect(response).to render_template :new 
    end 
    end 

В моих маршрутов у меня есть:

purchases GET      /purchases(.:format)      purchases#index 
           POST      /purchases(.:format)      purchases#create 
        new_purchase GET      /purchases/new(.:format)     purchases#new 
        edit_purchase GET      /purchases/:id/edit(.:format)    purchases#edit 
         purchase GET      /purchases/:id(.:format)     purchases#show 
           PATCH      /purchases/:id(.:format)     purchases#update 
           PUT      /purchases/:id(.:format)     purchases#update 
           DELETE     /purchases/:id(.:format)     purchases#destroy 

invoices GET      /invoices(.:format)       invoices#index 
           POST      /invoices(.:format)       invoices#create 
        new_invoice GET      /invoices/new(.:format)      invoices#new 
        edit_invoice GET      /invoices/:id/edit(.:format)    invoices#edit 
         invoice GET      /invoices/:id(.:format)      invoices#show 
           PATCH      /invoices/:id(.:format)      invoices#update 
           PUT      /invoices/:id(.:format)      invoices#update 
           DELETE     /invoices/:id(.:format)      invoices#destroy 

Когда я запускаю тест я получаю это:

1) InvoicesController GET new assigns a new invoice to @invoice 
    Failure/Error: get :new 
    ActiveRecord::RecordNotFound: 
     Couldn't find Purchase with 'id'= 
    # ./app/controllers/invoices_controller.rb:7:in `new' 
    # ./spec/controllers/invoices_controller_spec.rb:38:in `block (3 levels) in <top (required)>' 

    2) InvoicesController GET new renders the :new template 
    Failure/Error: get :new 
    ActiveRecord::RecordNotFound: 
     Couldn't find Purchase with 'id'= 
    # ./app/controllers/invoices_controller.rb:7:in `new' 
    # ./spec/controllers/invoices_controller_spec.rb:43:in `block (3 levels) in <top (required)>' 

Вот отрывок из test.log

[1m [36m (0,1 мс) [0m [1mRELEASE SAVEPOINT active_record_1 [0м [ 1m [35m (0.1ms) [0m SAVEPOINT active_record_1 [1m [36mSQL (0.3ms) [0m [1mINSERT INTO «покупки» («id», «vendor_id», «order_number», «status», «notes», tradegecko_url "," created_at "," updated_at ") VALUES ($ 1, $ 2, $ 3, $ 4, $ 5, $ 6, $ 7, $ 8) RETURNING" id "[0m [[" id ", 4], [" vendor_id ", 4 ], ["order_number", "zzz"], ["status", "cancel"], ["notes", "Jean shorts cliche Williamsburg raw deni Положите на него птичку. Shoreditch keytar Бруклинский ломо-бранч. «Cosby Sweater» Mcsweeney +1 PBR Austin biodiesel freegan. »], [" Tradegecko_url "," http://gorczany.info "], [" created_at "," 2016-07-19 14: 51: 00.616108 "], [" updated_at "," 2016- 07-19 14: 51: 00.616108 "]] [1 м [35 м (0,1 мс) [0 м РЕЛИЗ SAVEPOINT active_record_1 [1 м [36 м (0,1 мс) [0 м [1 мАВАПЕРОН Active_record_1 [0m [1 м [35 мСкс (0,3 мс) [0m INSERT INTO «счета-фактуры» («id», «buy_id», «number», «terms», «currency», «total_due», «current_balance», «due_date», «notes», «status», «created_at» "," updated_at ") ЗНАЧЕНИЯ ($ 1, $ 2, $ 3, $ 4, $ 5, $ 6, $ 7, $ 8, $ 9, $ 10, $ 11, $ 12) RETURNING" id "[[" id ", 4], [" purchase_id " 4], ["number", "dd"], ["terms", "TT"], ["currency", "MM"], ["total_due", "25000.0"], ["current_balance", "12500.0 "], [" due_date "," 2015-11-13 "], [" notes "," Scenester Carles cred quinoa fixie помещают птицу на него Четыре уровня Loko. Биодизель вице Wayfarers устойчивый бранч мясник locavore. KeyTar Vice следующего уровня Stumptown Rerry Richardson. "], [" Status "," cancel "], [" created_at "," 2016-07-19 14: 51: 00.619066 "], [" updated_at "," 2016-07- 19 14: 51: 00.619066 "]] [1m [36m (0.1ms) [0m [1mRELEASE SAVEPOINT active_record_1 [0m Обработка InvoicesController # new как HTML [1m [35mPurchase Load (0.3ms) [0m SELECT" приобретает " . * FROM «покупает» ГДЕ «покупает». «Id» = $ 1 LIMIT 1 [["id", nil]] Завершено 404 Не найдено в 2 мс (ActiveRecord: 0,3 мс)

Я думаю, проблема в том, что

+0

Эта ошибка говорит, что вы делаете это: 'ModelXYZ.find ()' и идентификатор не сохраняется. (RecordNotFound) Пожалуйста, разместите свои маршруты, чтобы помочь нам. – siegy22

+0

Спасибо, что нашли время, чтобы попытаться помочь мне. Я понимаю, что говорит ошибка, я не могу понять, как это исправить. Я попытался создать запись покупки с FactoryGirl до примера, но это не сработало, у меня все еще была такая же ошибка. – NeyLive

ответ

0

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

def new 
    @purchase = Purchase.find(params[:purchase]) 
    @invoice = Invoice.new(:purchase_id => params[:purchase]) 
    end 

, но в тесте вы не передавая параметр :purchase (должно быть: purchase_id я думаю)!

+0

Справа. В фактическом приложении счет можно создавать только из покупки, так что buy_id передается в создаваемый счет-фактуру. В тесте я попытался вручную создать покупку до примера, я попытался использовать FactoryGirl, чтобы создать покупку до примера. Тем не менее я не могу получить buy_id, переданный в новый счет-фактуру. – NeyLive

+0

хорошо .. может быть, попытаться больше? так что же вы тогда пробовали? – phoet

+1

также может быть полезным для изучения содержимого журнала/test.log при выполнении ваших тестов. – phoet

0

Ассоциации, заявленные на заводах, не сохраняются, что приводит к нулевому значению для Purchase.id.

Итак, после попытки перед обратными вызовами, после обратных вызовов, я отказался от использования автогенерируемых ассоциаций FactoryGirl.

В конце концов, это то, что я должен был сделать:

Я удалил все указанные ассоциации с заводов, то делали это вручную, отредактированный код в спецификации:

describe "GET new" do 

    it "assigns a new invoice to @invoice" do 
     invoice = FactoryGirl.create(:invoice) 
     get :new, purchase: FactoryGirl.create(:purchase) 
     expect(assigns(:invoice)).to_not eq(invoice) 
    end 

    it "renders the :new template" do 
     get :new, purchase: FactoryGirl.create(:purchase) 
     expect(response).to render_template :new 
    end 
    end 

Я надеюсь, что это помогает любому, кто сталкивается с этой проблемой.

+0

f.purchase_id {rand (1..30)} Я думаю, что это ваша проблема или ее часть. ваш завод создает случайный код покупки – Doon

+0

Можете ли вы добавить автоматически созданную 'покупку' обратно на свой завод, а затем изменить свой вызов на' get' так? 'get: new, purchase: invoice.purchase' –

+0

Doon - я попытался удалить эту строку, и когда это не сработало, я изменил ее на последовательность, по-прежнему ту же ошибку. – NeyLive

Смежные вопросы