调用方法我在之前的一个不好的练习中进行测试吗?

时间:2014-06-27 14:41:00

标签: testing rspec

# the first
it "should render China's jobs page with country_name china" do
  get 'show', country: 'china'
  expect(assigns(:title)).to eq("#{location.country} Tech Jobs")
  expect(response).to be_success
end

# the second
context "with country name" do
  before { get 'show', country: 'china' }
  it { expect(assigns(:title)).to eq("#{location.country} Tech Jobs") }
  it { expect(response).to be_success }
end

您认为哪一个更好? 如果before { get 'show' }不是一个不好的做法,我更喜欢第二个。

1 个答案:

答案 0 :(得分:2)

我不会说这是一种不好的做法,但确实有一些缺点:

  • 速度慢。在第二种情况下,它有2个示例,每个示例都运行get 'show', country: 'china' - 当get 'show'本身很慢时会导致明显的缓慢。
  • 它产生的文档输出(至少对我来说)并不能很好地描述行为。比较两种情况的--format doc输出。
  • 这使得为将来添加的其他示例添加额外设置变得更加困难。考虑是否需要测试的未来案例需要插入数据库中的特定记录才能正常工作。由于正在测试的操作(get 'show')位于before块而不是示例正文中,因此您无法轻松地将其他设置添加到需要它的示例中。(当然,您可以,将其他设置添加到before块本身,但这会加剧缓慢问题。)

使用before块也有一些好处。它可以很容易地遵循每个例子中的一个期望"指南。这反过来将为您提供assigns单独的失败或传递示例以及响应状态期望,例如,可以更清楚地确定失败的原因。

您使用哪种取决于您想要做出的权衡。我个人倾向于你的第一个例子(没有before阻止)。

另一方面,如果我要使用后一种形式,我会使用specify别名(而不是it),因为我只想使用it当doc字符串或匹配器作为it之外的英语表达式读取时:

specify { expect(assigns(:title)).to eq("#{location.country} Tech Jobs") }
specify { expect(response).to be_success }