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