2016-08-23 28 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

無論如何感謝:) 只是爲了記錄,我想對我的問題更加簡潔(刪除「我認爲這是一個愚蠢的問題」,但不會讓我發佈它沒有更多的文字:( –

+0

我回答是因爲我認爲Ruby方法通常會比RSpec功能做更好的(更可讀,更不神祕的)DRYing規格的工作,共享的例子等很快就難以遵循。不知道這些問題;我將不得不實驗 –

0

你沒有。瞧,不客氣。

相關問題