我正在使用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]分配值,则测试通过。
有没有人知道我需要改变什么才能让这些测试再次开始工作。
提前致谢
安迪
答案 0 :(得分:3)
您需要在subject { controller }
声明之前致电it
。这实际上让我困惑了一段时间,我写了my first ever blog post about it。
答案 1 :(得分:0)
如果您使用的是Ruby 1.9.2,assign_to
宝石版本低于1.0.0beta2的shoulda-matchers
匹配器仍然无效,即使您包含subject { controller }
(其中,我相信,并不是真的需要。)
这是由Ruby 1.9.2的变化引起的。这是bugreport for shoulda。该修复程序为already included,并在shoulda-matchers
版 1.0.0beta2 中发布。
所以,只需在Gemfile
中填写此内容:
group :development, :test do
gem 'shoulda-matchers'
...
并更新到最新版本(1.0.0.beta2 atm):
bundle update shoulda-matchers