RSpec - значения, которые не устанавливаются для пользовательских атрибутов должным образом - PullRequest
1 голос
/ 29 марта 2012

У меня есть тест, который я пытаюсь отладить, и я заметил, что значения не устанавливаются для пользовательских атрибутов должным образом.Когда я запускаю 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

Кто-то из IRC-канала #rubyonrails предположил, что это может быть проблемой с областью действия, и спросил, где определен мой пользователь, сказав, что мои блоки before и it могут ссылаться на разных пользователей.Я не думал, что это должно быть проблемой, потому что у меня есть другие тесты в том же файле спецификации с блоками before и it, которые работают очень хорошо.Мысли?

1 Ответ

2 голосов
/ 29 марта 2012

Вам нужно подумать, что делает ваш код.

Он проходит через каждый и создает 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
...