7

我是 Rails 和测试驱动开发领域的新手。对于 TDD,我使用的是 RSpec 和 Capybara。目前,我正在编写一个教程以了解有关 Rails 的更多信息,作者正在使用以下语法:

page.should have_title('All users')
expect(page).to have_selector('li', text: user.name)

由于看起来两者都可以互换,我想知道何时使用哪种语法?因为,对于上述情况,我还可以写:

page.should have_title('All users')
page.should have_selector('li', text: user.name)

哪个基本上是一样的,对吧?

另外,我什么时候应该使用“指定”而不是“它”?

it { should have_link('Sign out', href: signout_path) }
specify { expect(user.reload.name).to eq new_name }

在这种情况下,我还可以写:

it { should have_link('Sign out', href: signout_path) }
it { expect(user.reload.name).to eq new_name }

我想使用哪一个的决定取决于我想要表达的内容。也许,你可以在这里帮助我?!

谢谢!

4

3 回答 3

9
page.should have_title('All users')
expect(page).to have_selector('li', text: user.name)

选择后者,它是更新的,他们正在朝那个方向推进。我不知道他们是否有意弃用前者,但如果他们这样做,您将不必更新所有代码。

it { should have_link('Sign out', href: signout_path) }
specify { expect(user.reload.name).to eq new_name }

它们是别名,因此只需选择使其更清晰的那个。如果您为测试命名,您将知道何时使用哪个(示例)。

it { should have_link('Sign out', href: signout_path) }

坦率地说,我避免使用未命名的规范样式。这有点太神奇了,很难推理,并且通常需要杂技设置才能正确解决问题。此外,我使用 运行我的规范--format documentation,而自动生成的消息永远不是我想要的。在这种情况下,我想说的是it 'has a signout link'

于 2013-07-19T11:13:43.400 回答
2

期望语法是新语法,它也是 rspec 团队推荐的语法,参见: http: //myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax

关于它并指定,请参阅:RSpec 中的 it 块和指定块之间的区别

于 2013-07-19T11:02:23.277 回答
0

当多行有相同的主题时,可以使用subjectand将其干燥should。使用expect实际上可以使您的代码不那么干燥。见:http ://betterspecs.org/#subject

你举了这个例子:

page.should have_title('All users') 
page.should have_selector('li', text: user.name)

最好说:

subject { page }
it { 
  should have_title('All users')
  should have_selector('li', text: user.name)
}

这很有趣,因为在上面的 betterspecs 链接中,首选方法不是使用expect,而是使用shouldDRY。您可以在此处查看 myronmarston 对此的评论:http: //myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax#comment-564045016

于 2014-06-30T17:54:53.000 回答