RSpec предоставляет фреймворк для написания того, что можно назвать исполняемыми спецификациями поведения приложений. В этой короткой заметке я хочу объяснить, почему использую именно этот фреймворк, а не классическую библиотеку TestUnit.
-
Я больше не путаю, в каком порядке стоит передавать ожидаемое и реальное значения. Сравните:
assert_equal('login', @user.login)
и
@user.login.should == 'login'Кстати, я перепутал параметры assert_equal и когда писал эту заметку.
-
Одного взгляда на тест хватает, чтобы понять, как должны вести себя объекты:
context 'The User model with fixtures loaded' do
specify 'should be friended by the user if this user added him to friends' do
users(:bob).friends << users(:chris)
users(:chris).should have(1).friended
users(:chris).friended.first.should == users(:bob)
end
end -
Результаты тестов представлены в простой и понятной форме, простыми предложениями, в которых делаются утверждения относительного тех или иных сущностей системы. В большинстве случаев даже нет необходимости даже смотреть в тесты, чтобы оценить функциональность!
The newly created User - should be valid with all neccessary attributes specified - should be invalid without login - should be invalid when login length is less than 2 - should be invalid without email - should be invalid with wrong email - should be invalid with someone else's login - should be invalid with someone else's email - should not require password and password_confirmation
- Я наконец-то начал писать тесты до того, как приступить к реализации функциональности в коде. По сути, любой программист мысленно продумывает, как должен вести себя тот или иной метод в виде “получив строку ’somestring’ метод должен вернуть ‘anotherstring’”. Нет ничего проще, чем описать такие размышления BDD-тестами.
-
Встроенная и гибкая система mock-объектов позволяет тестировать функциональность ровно один раз. Например, тестируя контроллеры, нет необходимости использовать базу данных и модели,- достаточно проверить, что вызываются нужные методы моделей.
context 'Given an signup action of UserController' do
controller_name 'user'
setup do
@user = mock('user')
add_stubs(@user, :password= => nil, :password_confirmation= => nil, :new_password= => nil)
end
specify 'should render edit template with empty User object' do
User.should_receive(:new).with(:no_args).and_return(@user)
get :signup
response.should render_template(:edit)
assigns[:user].should be(@user)
end
end
Русский
English
This plugin shine a light over hours of frustrating test sessions
Thank you !
Yeah, rspec is a great tool!
[...] Advantages of rspec [...]