Rail 3.2.2 / Devise: предупреждение об устаревании с помощью rspec - PullRequest
14 голосов
/ 03 марта 2012

Я недавно обновил приложение до rails 3.2.2.

Я использую Factory_girl

Factory.sequence: имя do | n | "name - # {n}" end

Factory.define: пользователь do | u | u.first_name {Factory.next (: name)}
u.last_name {| u | 'last_' + u.first_name} u.password 'secret'
u.password_confirmation {| u | u.password} u.sequence (: электронная почта) {| i | "user_#ndomi‹@example.com"}

конец

и этот простой тест

указать {Factory.build (: пользователь) .should be_valid}

генерирует следующее предупреждение

ПРЕДУПРЕЖДЕНИЕ ОБ УСТРАНЕНИИ: Вы пытаетесь создать атрибут user_id'. Writing arbitrary attributes on a model is deprecated. Please just use attr_writer` и т. Д. (Вызывается из блока (2 уровня) в на ...

Как мне от этого избавиться?

Ответы [ 3 ]

19 голосов
/ 10 марта 2012

Вероятно, это потому, что вы не подготовили / не перенесли свою тестовую базу данных с обновленными определениями столбцов, поэтому она думает, что вы пытаетесь произвольно установить атрибут.

Запустите rake db:test:prepare, чтобы убедиться, что он обновлен.

Вот исходный код этого метода, где вы можете сначала увидеть, как Rails проверяет столбец или атрибут, а затем предупреждает, если они не найдены.

4 голосов
/ 08 марта 2012

Я встретил то же предупреждение со следующим кодом:

Модель объявления:

class Ad < ActiveRecord::Base
    belongs_to :user
end

Фабрики:

FactoryGirl.define do 
    factory :ad do
        association :user
    end
end

FactoryGirl.define do 
    factory :user do
        first_name {Factory.next(:first_name)}
        last_name {Factory.next(:last_name)}
        email {|x| "#{x.first_name}.#{x.last_name}#{Factory.next(:count)}@test.com"}
        password Forgery(:basic).password
        confirmed_at Date.today << 10
    end
end

Тест

require 'spec_helper'

describe Ad do
    before(:each) do
        @ad = Factory.build(:ad)
    end

    "it is not valid without a user"
end

Запуск теста дал мне похожую ошибку.

Добавление

attr_accessor :user

к модели объявления исправило предупреждение.

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

0 голосов
/ 27 августа 2013

У меня было то же самое предупреждение, когда я проводил тесты в Rspec, и моя проблема заключалась в том, что у меня была модель Parent и модель Child, где у меня случайно было это:

class Child < ActiveRecord::Base
  belongs_to :parent
end

......

class Parent < ActiveRecord::Base
  belongs_to :child
end
...