2013-12-04 2 views
1

Я недавно модернизировал мое приложение Rails с Rails 4 и в моем RSpec тестов одна строка вызывает ошибку:Почему мои тесты Rspec терпят неудачу после обновления Rails 4?

ActiveRecord::StatementInvalid: 
    TypeError: can't cast Array to string: INSERT INTO "items" ("created_at", "date", "description", "invoice_id", "position", "price_in_cents", "quantity", "tax_rate", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) 

Это мой код:

# /spec/controllers/invoices_controller_spec.rb: 

require 'spec_helper' 

describe InvoicesController do 

    before :each do 
    ... 
    @invoice = FactoryGirl.create(:invoice, :project_id => @project.id, :user => @user, :items_attributes => [ FactoryGirl.attributes_for(:item) ]) # causing havoc 
    end 

    ... 

end 

# /spec/factories.rb: 

factory :invoice do 
    number 123 
    recipient { Faker::Name.name } 
    date { Time.zone.now.to_date } 
    association :user 
    association :project 
    factory :invoice_with_item do 
    items { |i| [i.association(:item)] } 
    end 
end 

Может Кто-нибудь скажет мне, что мне здесь не хватает?

Я предполагаю, что это как-то связано с тем, что класс Invoice принимает вложенные элементы.

+0

Мы узнаем, в чем проблема на самом деле? «Вызывать хаос» не очень описательно. – sevenseacat

+0

Почему вы не являетесь пользователем invoice_with_items ?? invoice = FactoryGirl.create (: invoice_with_items,: project_id => project.id,: user => user)? во всяком случае, как сказал семисекат, «причинение хаоса» никому не помогает – arieljuod

+0

@sevenseacat: ОК, добавлено сообщение об ошибке выше. – Tintin81

ответ

4

Ваша проблема может иметь какое-то отношение к Faker Gem, хотя я не думаю, что он смотрел бы на ваш код. Я не уверен, что изменилось в rails4, которые могут вызвать какие-либо проблемы с Faker (или factory_girl по этому вопросу)

Я имел фабрику так:

FactoryGirl.define do 
    factory :job, :class => Job do 
    ... 
    password  { Faker::Lorem.words()[0..38] } 
    ... 
    end 
end 

Это вызвало такую ​​же ошибку (только в rails 4 - работал нормально в 3), пока я не изменил его на «Faker :: Lorem.words(). join() [0..38] .to_s«

+0

Спасибо за это сообщение Я не знал, что он вернет массив. Это очень помогло мне. – wallerjake

+0

о, спасибо! атрибуту password требуется строка, но метод слов возвращает массив. Таким образом, если он будет введен в строку, все будет хорошо. – ahnbizcad

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