Учебное пособие по rails 3: проблема rspec + factory_girl_rails - PullRequest
3 голосов
/ 24 декабря 2010

Я следовал учебному руководству по Rails (http://railstutorial.org/chapters/beginning, версия Rails 3), и я остановился на 11-й главе при использовании Factory Girl и Rspec, у меня есть тест, который не проходит, и я чувствую, чтоЯ делаю что-то не так, но я не вижу, что.Прежде всего, есть Git-репозиторий на Github с кодом, который не проходит этот тест.http://github.com/Monomachus/ch3_static_pages

Итак, я получил модель пользователя

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation

  has_many :microposts
  .
  .
  .

У меня есть модель микросообщений

class Micropost < ActiveRecord::Base
  attr_accessible :content

  belongs_to :user

  default_scope :order => 'microposts.created_at DESC'
end

Затем я получил заводские настройки

Factory.define :user do |user|
  user.name                  "Michael Hartl"
  user.email                 "mhartl@example.com"
  user.password              "foobar"
  user.password_confirmation "foobar"
end

Factory.define :micropost do |micropost|
  micropost.content "Foo bar"
  micropost.association :user
end

И, наконец, код Rspec

require 'spec_helper'

describe Micropost do
    .
    . 
  describe "microposts associations" do

    before(:each) do
      @user = User.create(@attr)
      @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago)
      @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago)
    end

    it "should have a microposts attribute" do
      @user.should respond_to(:microposts)
    end

    it "should be in the reverse order of appearing" do
      @user.microposts.should == [@mp2, @mp1]
    end
  end
end

И я получилошибка, которая определенно говорит мне, что я делаю что-то не так.

Failures:

  1) Micropost microposts associations should be in the reverse order of appearing
     Failure/Error: @user.microposts.should == [@mp2, @mp1]
     expected: [#<Micropost id: 2, content: "Foo bar", user_id: nil, created_at: "2010-12-24 12:47:02", update
d_at: "2010-12-24 13:47:02">, #<Micropost id: 1, content: "Foo bar", user_id: nil, created_at: "2010-12-23 13:
47:02", updated_at: "2010-12-24 13:47:02">],
          got: [] (using ==)
     Diff:
     @@ -1,3 +1,2 @@
     -[#<Micropost id: 2, content: "Foo bar", user_id: nil, created_at: "2010-12-24 12:47:02", updated_at: "20
10-12-24 13:47:02">,
     - #<Micropost id: 1, content: "Foo bar", user_id: nil, created_at: "2010-12-23 13:47:02", updated_at: "20
10-12-24 13:47:02">]
     +[]
     # ./spec/models/micropost_spec.rb:42:in `block (3 levels) in <top (required)>'

Как видите, даже свойство user_id установлено неправильно +по-видимому, @ user.microposts не имеет никаких элементов. Пожалуйста, помогите мне с этим вопросом спасибо .

Ответы [ 3 ]

2 голосов
/ 24 декабря 2010

Ну, ответ был прост :) Я включил ассоциации микросообщений в спецификацию Micropost.

И ясно

describe "microposts associations" do

  before(:each) do
    @user = User.create(@attr)
    @mp1 = Factory(:micropost, :user => @user, :created_at => 1.day.ago)
    @mp2 = Factory(:micropost, :user => @user, :created_at => 1.hour.ago)
  end

  it "should have a microposts attribute" do
    @user.should respond_to(:microposts)
  end

  it "should be in the reverse order of appearing" do
    @user.microposts.should == [@mp2, @mp1]
  end
end

@ attr не содержит пользовательских свойств, но свойства микросообщений и, конечно, @user = nil, и тогда все имеет смысл Поэтому, если у вас возникла такая же проблема, включите этот код в спецификацию пользователя. Теперь все мои тесты проходят:)

1 голос
/ 02 сентября 2011

К тому времени, как я закончил главу по разбиению на страницы, в учебнике было создано 100 примеров пользователей с помощью Faker (листинг 10.25 на стр. 390), и в RubyMine я смог увидеть, что мой тест провалился, потому что программа выдавала исключение на дубликат адреса электронной почты пользователя (который имеет уникальное ограничение). @Attr в строке 8 user_spec.rb имеет: email => "user@example.com", однако это вызывает исключение, поскольку это дубликат электронной почты (я полагаю, потому что Faker уже создал его).

Для меня исправлением было скопировать @attr из строки 8 и вставить его в блок описания "ассоциации микросообщений" (user_spec.rb) и изменить адрес электронной почты на: email => "user@example999.com". Я уверен, что это полный взлом, но я n00b.

Обновление:

Еще одним исправлением для меня было закомментировать строку @user = User.create (@attr) и просто создать @ mp1 и @ mp2.

0 голосов
/ 31 августа 2011

В этом разделе я также получал тестовый сбой, хотя у меня уже были «ассоциации микросообщений» в user_spec.rb. Оказывается, мне нужно было перезапустить Spork и автотест, чтобы заставить их использовать новую фабрику «микросообщений» на фабриках.rb.

...