小编sim*_*ple的帖子

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

我正在尝试为 API 控制器编写简洁的测试,但我在使用 RSpec 提供的“单行”语法时遇到了问题。

我明确地覆盖主题以引用发布操作而不是控制器

let (:params) { some_valid_params_here }
subject { post :create, params }
Run Code Online (Sandbox Code Playgroud)

当我使用单行语法来测试 http_status 时,它工作正常:

it { is_expected.to have_http_status(:created) }
# pass!
Run Code Online (Sandbox Code Playgroud)

但当我尝试将它用于不同的期望时,它爆炸了:

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

值得注意的是,当我以更长的形式运行第二个期望时,明确地调用主题,它起作用了:

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

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

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

ruby rspec ruby-on-rails rspec-rails

2
推荐指数
1
解决办法
1294
查看次数

标签 统计

rspec ×1

rspec-rails ×1

ruby ×1

ruby-on-rails ×1