RSpec - 未正确设置用户属性的值

时间:2012-03-29 01:43:24

标签: ruby-on-rails rspec ruby-debug

我有一个测试我正在尝试调试,我注意到这些值没有正确地设置为用户属性。当我从调试控制台运行p user.height_feetp user.height_inches时,我得到nil,而我希望它们分别在第一个中返回18迭代。然而,p invalid_height.firstp invalid_height.second正确地返回18

以下是代码:

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频道中有人建议它可能是一个范围问题,并询问我的用户定义在哪里,说我的beforeit块可能指的是不同的用户。我不认为这应该是一个问题,因为我在同一个spec文件中有其他测试,beforeit块运行得很好。想法?

1 个答案:

答案 0 :(得分:2)

您需要考虑您的代码正在做什么。

通过每个并创建beforeit "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