2016-08-23 2 views
1

Как я могу сушить эту спецификацию?Как высушить эту спецификацию контроллера RSpec?

describe Api::TasksController, type: :controller do 
    it 'allows the creator of a task to destroy it' do 
    set_request_auth_header @user 
    delete :destroy, id: @task.id 
    expect(response).to be_success 
    expect(Task.count).to eq 0 
    end 

    it 'does not allow the assignee of a task to destroy it' do 
    set_request_auth_header @assignee 
    delete :destroy, id: @task.id 
    expect(response).to be_forbidden 
    expect(Task.count).to eq 1 
    end 

    it 'does not allow anyone unrelated to a task to destroy it' do 
    set_request_auth_header @spy 
    delete :destroy, id: @task.id 
    expect(response).to be_forbidden 
    expect(Task.count).to eq 1 
    end 
end 
+1

Я думаю, что этот обзор кода был бы более подходящим для этого сайта: http://codereview.stackexchange.com/ – arjabbar

+0

Я не знал этого сайта! Спасибо. –

ответ

0

Вы можете извлечь некоторые методы:

describe Api::TasksController, type: :controller do 
    it 'allows the creator of a task to destroy it' do 
    expect_delete_to_succeed @user 
    end 

    it 'does not allow the assignee of a task to destroy it' do 
    expect_delete_to_be_forbidden @assignee 
    end 

    it 'does not allow anyone unrelated to a task to destroy it' do 
    expect_delete_to_be_forbidden @spy 
    end 

    def expect_delete_to_succeed(requester) 
    delete_task requester 
    expect(response).to be_success 
    expect(Task.count).to eq 0 
    end 

    def expect_delete_to_be_forbidden(requester) 
    delete_task requester 
    expect(response).to be_forbidden 
    expect(Task.count).to eq 1 
    end 

    def delete_task(requester) 
    set_request_auth_header requester 
    delete :destroy, id: @task.id 
    end 

end 

Боковые ноты:

  • Использование экземпляра (@) переменные не является текущей стандартной практикой в ​​RSpec. Посмотрите на let 'variables'.
  • Task.exists? @task.id кажется более четким способом проверки удаления, чем проверка Task.count.
+0

Да, я прыгал, был какой-то DSL-подобный способ добиться этого, возможно, используя shared_examples или что-то в этом роде. –

+0

Спасибо в любом случае :) Только для записи я хотел быть более кратким по моему вопросу (удаление «Я думаю, что это глупый вопрос», но SO не разрешил бы мне публиковать его без текста :( –

+0

I ответил, так как я считаю, что методы Ruby часто делают более качественную (более читаемую, менее загадочную) работу над техническими характеристиками DRYing, чем функции RSpec. Общие примеры и такие быстро становятся все труднее следовать. Не знаю, что касается вопросов, мне придется экспериментировать –

Смежные вопросы