assigns_to не работает для Rails 3 Shoulda в Ubuntu

Я использую Rails3 с rspec и shoulda. У меня есть спецификация ниже

describe PagesController, "on GET to show while logged off" do
  before(:each) do
    @site = Factory.create(:site)
    @site.domains << Factory.create(:domain)
    @site.save!
    @site.pages << Factory.create(:page)
    @site.menus << Factory.create(:menu, {:site=>@site, :is_visible=>true})
    @site.menus << Factory.create(:menu, {:site=>@site, :is_visible=>true})
    @site.menus << Factory.create(:menu, {:is_visible=>false, :site=>@site})

    get :show
  end

  it { should render_template(:show) }
  it { should render_template('layouts/2col') }
  it { should assign_to(:site) }
  it { should assign_to(:site).with(@site) }
  it { should assign_to(:site).with(@site) }
  it { should assign_to(:page).with(@site.pages[0])}
  it "show visible menu_items only" do 
    assert assigns[:menu_items].length == 2
  end
end

Вот мой файл Gem

group :development, :test do
  gem 'autotest'
  gem 'factory_girl'
  gem 'rspec', '>=2.0.0.beta.19'
  gem 'rspec-rails', '>=2.0.0.beta.17'
  gem 'shoulda'
end

а вот мой spec_helper

require 'rspec/rails'
require 'shoulda'
require 'shoulda/integrations/rspec2'
require 'authlogic/test_case'
require 'factory_girl

Хорошо, пока все довольно близко соответствует тому, что я видел раньше, однако всякий раз, когда я запускаю свои тесты, я получаю ошибки, как показано ниже.

1) PagesController on GET to show while logged off 
     Failure/Error: it { should assign_to(:site) }
     Expected action to assign a value for @site
     # ./spec/controllers/pages_controller_spec.rb:19

Нет, моей первой мыслью было, что код сломан, однако приложение работает правильно. Также, если я проверяю, что значения присваиваются с помощью assigns[:site], тогда тест проходит.

Кто-нибудь знает, что мне нужно изменить, чтобы эти тесты снова начали работать.

Заранее спасибо

Энди


person Andrew Stewart    schedule 19.09.2010    source источник


Ответы (2)


Вам нужно вызвать subject { controller } перед вашими операторами it. На самом деле это меня так сильно смутило, что я написал свою первую написать об этом в блоге.

person Robert Speicher    schedule 20.09.2010
comment
хороший, удивительно, что документация rspec должна быть действительно слабой по сравнению с версией тестового модуля. Мне потребовались ночи, чтобы понять это, так как тот же самый код работал на Rails 2. - person Andrew Stewart; 20.09.2010
comment
Я не могу заставить его работать, даже указав тему, мои должны-сопоставители (1.0.0.beta1) с rspec 2.4.0 - person Samnang; 12.02.2011
comment
Хорошо, для меня это оказалось потому, что я использовал переработку, которая вводит фильтр до в контроллер приложения, который перехватывал «получить» еще до того, как он достиг моего действия. - person Paul Russell; 26.02.2011

Если вы используете Ruby 1.9.2, сопоставитель assign_to с версией gem shoulda-matchers ниже 1.0.0beta2 по-прежнему не будет работать, даже если вы включите subject { controller } (что, как мне кажется, на самом деле не нужно).

Это вызвано изменением в Ruby 1.9.2. Вот отчет об ошибке для shoulda. Исправление уже включено и выпущено в shoulda-matchers версии 1.0.0beta2< /сильный>.

Так что просто имейте это в своем Gemfile:

group :development, :test do
  gem 'shoulda-matchers'
  ...    

и обновить до последней версии (1.0.0.beta2 atm):

bundle update shoulda-matchers
person Paweł Gościcki    schedule 17.03.2011