2016-10-04 48 views
1

我試着寫簡短的測試,一個API控制器的一行語法,但我有與RSpec的提供的「一個班輪」語法的麻煩。使用的控制器規格

我壓倒一切的主題顯式地引用發佈,而不是控制器行動

let (:params) { some_valid_params_here } 
subject { post :create, params } 

當我使用的單行語法檢測HTTP_STATUS,它工作正常:

it { is_expected.to have_http_status(:created) } 
# pass! 

但是當我嘗試將其用於不同的期望,它炸燬:

it { is_expected.to change{SomeActiveRecordModel.count}.by(1) } 
# fail! "expected result to have changed by 1, but was not given a block" 

值得注意的是,當我運行在一個較長的形式是第二個期望,呼籲受到顯式,它的工作原理:

it "creates a model" do 
    expect{ subject }.to change{SomeActiveRecordModel.count}.by(1) 
end 
# pass 

這只是一個班輪語法的弱點,它不能處理這個更復雜的表達式?還是我誤解了一些關於如何推斷這些測試的主題?

(注:我知道,設定受到的動作有一些批評者,我很樂意聽取意見,但不是這個問題的目的)。

+0

對於API的,我覺得要求規格比控制器的規格更加有用,因爲它們實際上是經過佈線層,你可以寫預期有關JSON返回。額外的敏銳度是非常值得的,因爲它的速度稍慢。 – max

+0

@max這可能是我最終走向的方式,但問題實際上是關於RSpec而不是周圍的上下文。如果我將上述主題更改爲請求而不是控制器操作調用,那麼我仍然會遇到同樣的問題。 – simple

+0

@max我很感激指針,不過!看起來Rails 5不贊成控制器測試,所以我期望我會改變一些與這個問題無關的東西:) – simple

回答

2

你可以像下面這樣做 subject { -> { post :create, params } } 然後 it { is_expected.to change(SomeActiveRecordModel, :count).by(1) }

在這裏,您對此 github_topic

+0

我之前發現過這個話題,但還沒有設法讓它工作。我對兩個並行運行的主題有兩個測試 - 一個是請求響應,另一個是請求本身 - 感到困惑。 我會重新做一些事情把它分開。謝謝。 – simple

0

非常好的討論,有人說之前有涉及subject一個簡單的解決方案;它不需要lambda壽;我採用這種方式爲我CategoryController#show

describe '#show' do 
    subject { get :show, id: category } 

    context "as guest" do 
    it { is_expected.to render_template('show') } 
    end 
end 
相關問題