与Capybara(Rails)的TDD; page.should和expect(page).to之间的区别?

时间:2013-07-19 10:53:29

标签: ruby-on-rails ruby tdd capybara

我是铁轨和测试驱动开发领域的新手。对于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 }

我想决定使用哪一个是基于我想要表达的内容。也许,你可以帮帮我吗?!

谢谢!

3 个答案:

答案 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)

当您拥有多行相同的主题时,可以使用subjectshould将其干掉。使用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