5 вещей, за которые я люблю RSpec

(Ruby & Rails) · English (13,637 views)

RSpec предоставляет фреймворк для написания того, что можно назвать исполняемыми спецификациями поведения приложений. В этой короткой заметке я хочу объяснить, почему использую именно этот фреймворк, а не классическую библиотеку TestUnit.

  1. Я больше не путаю, в каком порядке стоит передавать ожидаемое и реальное значения. Сравните:

    1
    assert_equal('login', @user.login)

    и

    1
    @user.login.should == 'login'

    Кстати, я перепутал параметры assert_equal и когда писал эту заметку.

  2. Одного взгляда на тест хватает, чтобы понять, как должны вести себя объекты:

    1
    2
    3
    4
    5
    6
    7
    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
  3. Результаты тестов представлены в простой и понятной форме, простыми предложениями, в которых делаются утверждения относительного тех или иных сущностей системы. В большинстве случаев даже нет необходимости даже смотреть в тесты, чтобы оценить функциональность!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
  4. Я наконец-то начал писать тесты до того, как приступить к реализации функциональности в коде. По сути, любой программист мысленно продумывает, как должен вести себя тот или иной метод в виде “получив строку ’somestring’ метод должен вернуть ‘anotherstring’”. Нет ничего проще, чем описать такие размышления BDD-тестами.
  5. Встроенная и гибкая система mock-объектов позволяет тестировать функциональность ровно один раз. Например, тестируя контроллеры, нет необходимости использовать базу данных и модели,- достаточно проверить, что вызываются нужные методы моделей.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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

3 Responses to this entry

Subscribe to comments with RSS

said on 21.03.2007 at 12.00 · Permalink

This plugin shine a light over hours of frustrating test sessions :) Thank you !

Alex
said on 22.03.2007 at 11.15 · Permalink

Yeah, rspec is a great tool!

Comments are closed

Comments for this entry are closed for a while. If you have anything to say – use a contact form. Thank you for your patience.