我試着寫簡短的測試,一個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
這只是一個班輪語法的弱點,它不能處理這個更復雜的表達式?還是我誤解了一些關於如何推斷這些測試的主題?
(注:我知道,設定受到的動作有一些批評者,我很樂意聽取意見,但不是這個問題的目的)。
對於API的,我覺得要求規格比控制器的規格更加有用,因爲它們實際上是經過佈線層,你可以寫預期有關JSON返回。額外的敏銳度是非常值得的,因爲它的速度稍慢。 – max
@max這可能是我最終走向的方式,但問題實際上是關於RSpec而不是周圍的上下文。如果我將上述主題更改爲請求而不是控制器操作調用,那麼我仍然會遇到同樣的問題。 – simple
@max我很感激指針,不過!看起來Rails 5不贊成控制器測試,所以我期望我會改變一些與這個問題無關的東西:) – simple