неопределенный метод `stringify_keys 'при использовании Factory Girl - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть следующий блок кода в моем User_spec.rb:

 @user = { username:'newuser',
           email:'new@user.com',
           fname:'new',
           lname:'user',
           password:'userpw',
           password_confirmation:'userpw'}

для создания использования с использованием этих атрибутов. Однако пока я перенес все эти атрибуты в Factories.rb:

require 'factory_girl'

Factory.define :user do |u|
  u.username 'newuser'
  u.email 'new@user.com'
  u.fname 'new'
  u.lname 'user' 
  u.password 'newuserpw'
  u.password_confirmation 'newuserpw'
end

и замените строку в user_spec.rb на:

@user = Factory(:user)

все мои тесты, связанные с моделью User, были неудачными (например, тесты на электронную почту, пароль, имя пользователя и т. Д.), Все давали мне

"неопределенный метод` stringify_keys 'for… "

новый пользовательский объект

Ответы [ 3 ]

4 голосов
/ 21 ноября 2011

У меня была похожая проблема, и это потому, что я передавал объект FactoryGirl методу ActiveRecord create / new (упс!). Похоже, вы делаете то же самое здесь.

Первый / верхний @user, который вы перечислили, - это хэш значений , но второй / нижний @user - это экземпляр вашего пользовательского объекта (созданный FactoryGirl на летать).

Если вы называете что-то подобное в своих спецификациях:

user = User.new(@user)

Первая (хешированная) версия @user будет работать, но вторая (объективированная) версия не будет работать (и выдает ошибку 'stringify_keys'). Чтобы правильно использовать вторую версию @user, вы должны иметь это в своих спецификациях:

user = Factory(:user)

Надеюсь, это поможет.

3 голосов
/ 06 февраля 2012

Нам нужно увидеть пример неудачного теста для диагностики, но вот одна вещь, которая может его вызвать - отправка объекта, когда требуются атрибуты.Однажды я исправил один из моих неудачных тестов, изменив:

post :create, organization: @organization

на

post :create, organization: @organization.attributes
0 голосов
/ 30 мая 2014

@ rowanu Ответил на ваш вопрос, но позвольте мне также разметить мой пример для дальнейшего использования:

В моем случае произошел сбой:

@user = User.new user_attr
@user.bookings_build(Booking.new booking_attr)

Обратите внимание, что япытаюсь построить с экземпляром резервирования а не хешем атрибутов

Рабочий пример:

user_attr_hash    = FactoryGirl.attributes_for(:user)
booking_attr_hash = FactoryGirl.attributes_for(:booking)

@user = User.new user_attr_hash
@user.bookings.build(booking_attr_hash)

А в spec / factories / domain_factory.rb у меня есть

FactoryGirl.define do
  factory :user do
    # DEFAULT USER...
    password "123123123"
    email "factory_girl@aaa.aaa"
    # there rest of attributes set...
  end

  factory :booking do
    start_date Date.today
    end_date Date.today+3
    # the rest of attributes
  end
end
...