【问题标题】:TDD with Capybara (Rails); difference between page.should and expect(page).to?带 Capybara 的 TDD(Rails); page.should 和 expect(page).to 之间的区别?
【发布时间】:2014-07-01 01:54:53
【问题描述】:

我是 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)

基本上是一样的,对吧?

另外,我什么时候应该使用“specify”而不是“it”?

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 }

我想使用哪一个的决定取决于我想要表达的内容。或许,你能帮帮我?!

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby tdd capybara


    【解决方案1】:
    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'

    【讨论】:

    • 感谢您的回答!我想我只是已经习惯了整个 tdd 事情以及语法,以便了解何时使用哪个别名。顺便说一句:“--format 文档”非常好。
    【解决方案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

    【讨论】:

    • 博客链接非常宝贵。它还有助于解释我们如何在新项目中完全禁用 should 的使用。不错!
    【解决方案3】:

    如果多行有相同的主题,您可以使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多