我是铁轨和测试驱动开发领域的新手。对于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 }
我想决定使用哪一个是基于我想要表达的内容。也许,你可以帮帮我吗?!
谢谢!
答案 0 :(得分: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 }
它们是别名,所以只需选择使其更清晰的。如果您为测试命名,您将知道何时使用哪个(example)。
it { should have_link('Sign out', href: signout_path) }
坦率地说,我避免使用未命名的规范样式。这有点太神奇,难以推理,并且经常需要杂技设置才能使主题正确运行。另外,我使用--format documentation
运行我的规范,自动生成的消息永远不是我想要的。在这种情况下,我想说it 'has a signout link'
答案 1 :(得分:2)
expect语法是新语法,也是rspec团队推荐的语法,请参阅:http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
关于它并指定,请参阅:Difference between an it block and a specify block in RSpec
答案 2 :(得分:0)
当您拥有多行相同的主题时,可以使用subject
和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
,而是使用should
来支持DRY。你可以在这里看到myronmarston对此的评论:http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax#comment-564045016