Testing 正在调用方法I';我在一个街区前测试坏习惯?

Testing 正在调用方法I';我在一个街区前测试坏习惯?,testing,rspec,Testing,Rspec,你认为哪一个更好? 如果在{get'show}之前的不是一个坏习惯,我更喜欢第二个。我不会说这是一个坏习惯,但它确实有一些缺点: 比较慢。在第二种情况下,它有两个示例,每个示例都运行get'show',country:“china”——当get'show'本身运行缓慢时,可能会导致明显的缓慢 它产生的文档输出(至少对我来说)并不能很好地描述行为。比较这两种情况下的--format doc输出 这使得在将来可能添加的其他示例中添加额外设置变得更加困难。考虑是否有一个未来的测试用例需要在DB中插入

你认为哪一个更好?
如果在{get'show}之前的
不是一个坏习惯,我更喜欢第二个。

我不会说这是一个坏习惯,但它确实有一些缺点:

  • 比较慢。在第二种情况下,它有两个示例,每个示例都运行
    get'show',country:“china”
    ——当
    get'show'
    本身运行缓慢时,可能会导致明显的缓慢
  • 它产生的文档输出(至少对我来说)并不能很好地描述行为。比较这两种情况下的
    --format doc
    输出
  • 这使得在将来可能添加的其他示例中添加额外设置变得更加困难。考虑是否有一个未来的测试用例需要在DB中插入特定的记录才能正常工作。由于正在测试的操作(
    get'show')
    位于
    之前的
    块中,而不是在示例正文中,因此您无法轻松地向需要它的示例添加其他设置。(当然,您可以在
    块本身之前将附加设置添加到
    ,但这会加剧慢度问题)
块之前使用
还有一些好处。它使遵循“每个示例一个期望”准则变得容易。这将为
分配
和响应状态期望提供单独的失败或通过示例,例如,这可以更清楚地说明什么是失败

您使用哪一种取决于您想要做出什么样的权衡。我个人倾向于您的第一个示例(在
块之前没有

另一方面,如果我要使用后一种形式,我会使用
specify
别名(而不是
it
),因为我只喜欢在文档字符串或匹配器读取时使用
it
,而不是
it

# 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

我使用第一种形式是因为,与第二种形式不同,它表达了正在测试的需求。尽管我认为这类事情很重要(甚至比一些客观细节更重要),但它可能不够客观。
specify { expect(assigns(:title)).to eq("#{location.country} Tech Jobs") }
specify { expect(response).to be_success }