2012-03-29 2 views
1

У меня есть тест, который я пытаюсь отлаживать, и я заметил, что значения не соответствуют соответствующим атрибутам пользователя. Когда я запускаю p user.height_feet или p user.height_inches с консоли отладки, я получаю nil, и вместо этого ожидаю, что они вернут 1 и 8 соответственно на первой итерации. p invalid_height.first и p invalid_height.second возвращение 1 и 8 должным образом, однако.RSpec - Значения не соответствуют соответствующим атрибутам пользователя

Вот код:

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, которые работают нормально. Мысли?

ответ

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 
+1

Thanks! Очень информативно. Я не знаком с блоками 'context', поскольку я новичок в ruby, но я изучу его, чтобы узнать больше. – Nick