我有一个测试我正在尝试调试,我注意到这些值没有正确地设置为用户属性。当我从调试控制台运行p user.height_feet
或p user.height_inches
时,我得到nil
,而我希望它们分别在第一个中返回1
和8
迭代。然而,p invalid_height.first
和p invalid_height.second
正确地返回1
和8
。
以下是代码:
describe "when height is invalid" do
invalid_height = [[1, 8], [8, 2], [5, 13], ['text', 'text'], ['text', 11], [5, 'text'], ['', '']]
invalid_height.each do |invalid_height|
before do
user.height_feet = invalid_height.first
user.height_inches = invalid_height.second
end
it "should not be valid" do
debugger
user.should_not be_valid
end
end
end
调试终端的输出:
(rdb:1) p user.height_feet
nil
(rdb:1) p user.height_inches
nil
(rdb:1) p invalid_height.first
1
(rdb:1) p invalid_height.second
8
#rubyonrails IRC频道中有人建议它可能是一个范围问题,并询问我的用户定义在哪里,说我的before
和it
块可能指的是不同的用户。我不认为这应该是一个问题,因为我在同一个spec文件中有其他测试,before
和it
块运行得很好。想法?
答案 0 :(得分:2)
您需要考虑您的代码正在做什么。
通过每个并创建before
和it "should not be valid"
但这些都在同一范围内得到了评估。
所以你创建了before
块
before do
user.height_feet = 1
user.height_inches = 8
end
before do
user.height_feet = 8
user.height_inches = 2
end
...
before do
user.height_feet = ""
user.height_inches = ""
end
您创建了it
块
it "should not be valid" do
debugger
user.should_not be_valid
end
it "should not be valid" do
debugger
user.should_not be_valid
end
...
it "should not be valid" do
debugger
user.should_not be_valid
end
因此,所有测试的结果基本上都是
before do
user.height_feet = ""
user.height_inches = ""
end
it "should not be valid" do
debugger
user.should_not be_valid
end
我相信这不是你的意图。
明显的解决方法是使用context
块。这会将每对陈述密封在一个上下文中。
[[1, 8], [8, 2], [5, 13], ['text', 'text'], ['text', 11], [5, 'text'], ['', '']
].each do |feet, inches|
context "with an invalid height of #{feet} feet, #{inches} inches" do
before do
user.height_feet = feet
user.height_inches = inches
end
it "should not be valid" do
debugger
user.should_not be_valid
end
end
end