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 }