对于我的Rails 3应用程序,我将FactoryGirl与shoulda context(1.0.0.beta1)和matchers(1.0.0.beta3)一起用于我的功能测试。 我的问题:在下面的代码示例中,assign_to测试失败,因为@user - 令我惊讶的是 - 结果是零。在外部设置块中,为@user分配了一个有效的模型实例,但是在should assign_to语句中,实例变量不可访问。为什么这样做以及编写该测试的正确方法是什么?
class UsersControllerTest < ActionController::TestCase
context "as admin" do
setup do
@user = Factory.create(:user)
end
context "getting index" do
setup do
get :index
end
should assign_to(:users).with([@user])
end
end
答案 0 :(得分:0)
我发现将价值作为黑人传递奇迹般起作用。但是,在深入研究实际AssignToMatcher code之后,为什么参数方法在块方法不起作用时似乎没有意义。
为了+250代表我正在投资这个,我仍然想要一个解释为什么param方法不起作用(以及如何修复它)的答案,但在那之前,至少我有一个解决方法。
@ dblp1,希望这也适合你。以下是您的代码特有的示例:
class UsersControllerTest < ActionController::TestCase
context "as admin" do
setup do
@user = Factory.create(:user)
end
context "getting index" do
setup do
get :index
end
should assign_to(:users).with { [@user] }
end
end
end
答案 1 :(得分:0)
(因为相当长的时间我作为答案粘贴)
我嘲笑了你的测试并检查了结果是什么。
有趣的是,当我打电话给匹配器@post=null
时(我相信你的情况)。我认为这些问题(经过一段时间的调查),它来自调用setup do
块的顺序,以及在一个上下文中定义的变量在嵌套上下文中不可见的事实。
修改后的课程
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。
即使我删除了第一个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)
,我相信它会起作用。
答案 2 :(得分:-1)
使用索引时,应使用复数的实例变量。
@users
而不是@user
您还应该将其填充为数组。
最后,Shoulda匹配器应该以“它”开头并且包含在括号中,至少在RSpec世界中,这是我使用的。不确定是否是Test :: Unit的情况,或者上面的格式是否有效。
尝试这样的事情。
class UsersControllerTest < ActionController::TestCase
context "as admin" do
setup do
@user = Factory.create(:user)
end
context "getting index" do
setup do
@users = Array.new(3) { Factory(:user) }
get :index
end
it { should assign_to(:users).with(@users) }
end
end