(я вставляю в качестве ответа, поскольку он довольно длинный)
Я немного высмеял ваш тест и проверил, какие результаты были пройдены.
Довольно интересно, когда я вызываю совпадение@post=null
(как я полагаю в вашем случае).Проблемы, которые, я думаю (после некоторого времени исследования), связаны с порядком вызова блока setup do
и тем фактом, что переменные, определенные в одном контексте, не видны во вложенном контексте.
измененоclass
context "as admin" do
setup do
@post = Post.new
puts "Step 1 - inside setup do"
puts @post.class
end
puts "Step 2 - outside setup do 1"
puts @post.class
context "getting index" do
setup do
get :index
end
puts "Step 3 - calling shoulda"
puts @post.class
should assign_to(:posts).with([@post])
#should assign_to(:posts).with { [@post] }
end
end
И результаты в консоли
ruby -I test test/functional/posts_controller_test.rb
Step 2 - outside setup do 1
NilClass
Step 3 - calling shoulda
NilClass
Loaded suite test/functional/posts_controller_test
Started
Step 1 - inside setup do
Post
Таким образом, цикл установки вызывается в конце (а не в начале), а затем передается в Nil при передаче вmatcher.
Даже если я удаляю первое setup do
, это не очень хорошо работает.
Step 1 - inside setup do
Post
Step 2 - outside setup do 1
Post
Step 3 - calling shoulda
NilClass
Наконец, помещаем сообщение во внутренний контекст
Step 3 - calling shoulda
Post
Если вы вызываете @user = Factory.create(:user)
непосредственно внутри контекста «получения индекса», я думаю, что это сработает.