Отчеты RSpec против производительности - PullRequest
1 голос
/ 12 августа 2011

Я бы хотел написать такую ​​спецификацию, как

describe Foo do
    before :each do
        @hash = some_very_expensive_setup_op
    end
    describe "hash" do
        subject{@hash}
        its([:a]){should == 10}
        its([:b]){should == 20}
        its([:c]){should == 30}
    end
end

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

Я мог бы переписать спецификацию как

describe Foo do
    before :each do
        @hash = some_very_expensive_setup_op
    end
    describe "hash" do
        it "should have some attributes" do
            @hash[:a].should == 10
            @hash[:b].should == 20
            @hash[:c].should == 30
        end
    end
end

Теперь все утверждения сделаны в одном блоке. Спецификация функционально идентична, но я не получаю сочные отчеты о первой версии, перечисляющие каждое утверждение в форматере документации.

Вывод важен для меня, потому что я пытаюсь использовать вывод в качестве документации для потребителей веб-API. Например, для одной из моих спецификаций у меня есть вывод вроде

GET /status.json?ago=:ago
  it should behave like authenticated
    GET /status.json
      accepts a valid user
      rejects an invalid user
  request
    request attributes
      :ago - number of seconds of history to calculate statistics
      :current_user ( implicit )
    response attributes
      scale
      downtime
      points
      nextlevel

Но с увеличением количества атрибутов характеристики замедляются.

Существуют ли какие-либо решения для этого противоречия между мелкозернистыми отчетами? выход и тест производительности?

Ответы [ 2 ]

1 голос
/ 20 июля 2012

Вы можете использовать before :all, который будет запускать данный блок один раз перед всеми блоками it в описании.

Если вы используете транзакционные функции (как по умолчанию в Rails), вам нужнобудь немного осторожнееВставки, сделанные в before :all, не будут откатываться, и вам также следует .reload любые модели, которые вы создадите в случае, если они были изменены тестами.

(Для полноты также есть before :suite)

Документация: https://www.relishapp.com/rspec/rspec-core/v/2-11/docs/hooks/before-and-after-hooks

0 голосов
/ 20 июля 2012

Решение состоит в том, чтобы использовать пакеты типа https://github.com/LRDesign/rspec-steps

steps "Login and change password" do
   it "should show the login form" do
     visit root
     page.should have_text "Login"
   end

   it "should successfully log in" do
     fill_in :name, "Johnny User"
     click "Login"
     page.should have_text "Welcome, Johnny!"
   end

   it "should load the password change form" do 
     click "My Settings"
     click "Update Password"
     page.should have_selector("form#update_password")
   end     

   it "should change the user's password successfully" do
     fill_in :password, "foobar"
     fill_in :password_confirmation, "foobar"
     click "Change Password"
     page.should have_text "Password changed successfully!"
     User.find_by_name("Johnny User").valid_password?("foobar").should be_true 
   end

 end

Состояние поддерживается между его вызовами, вы можете проверить последовательность шагов, если хотите.

...