使用控制器规格的单线语法

时间:2016-10-04 13:21:23

标签: ruby-on-rails ruby rspec rspec-rails

我正在尝试为API控制器编写简洁测试,但我在使用" one-liner" 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

这只是单行语法的弱点,它无法处理这个更复杂的表达式吗?或者我误解了主题如何被推断到这些测试中?

(注意:我知道将主题设定为某个行动有一些批评者,我很高兴听到意见,但这不是这个问题的目的)。

2 个答案:

答案 0 :(得分:3)

你可以这样做 subject { -> { post :create, params } } 然后 it { is_expected.to change(SomeActiveRecordModel, :count).by(1) }

在这里你对此有非常好的讨论 github_topic

答案 1 :(得分:0)

正如之前所说,这是一个涉及col-md-1的简单解决方案;它不需要col-md-1.5 tho;我以这种方式为我的subject

应用了它
lambda