我的“啊哈!” 当我真正坐下来阅读有关该主题的权威资源,Rspec和Cucumber书籍时,就发生了在Ruby和Rails中进行测试的时刻。我分享了您最初对Cucumber的不屑一顾,但是后来我意识到我是从错误的角度看图片的。
基本上,Cucumber是关于BDD(行为驱动的开发)的-您将使用Cucumber来计划功能,接下来将要进行的工作。嗯,接下来,您希望用户能够在论坛上发布帖子或其他内容(以举个例子为例)。因此,您可以编写简单的内容。
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
请注意,其中几乎没有任何相关代码的引用。这就是您的步骤。重构代码时,可能必须更改步骤定义,但是行为(您的功能)将永远不需要更改。
现在,每次您运行Cucumber功能时,您几乎都将被引导到如何使用TDD(测试驱动的开发)来测试功能。这是使用RSpec在较低级别完成的。
第一次运行-我的第一步定义未定义。复制该块以在user_steps.rb甚至session_steps.rb中定义它,因为它与用户及其会话有关。现在,您如何定义用户已登录?您可以引导他们完成登录过程。
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
应该都开心。第二步。
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
再次很容易。请注意,如果我们完全重做登录过程,或者帖子的定义和显示方式,则不必更改行为。第三步。
When /^I vote the post up$/ do
pending
end
在这里,您开始谈论新功能,但是您还不太了解它的工作方式。您如何对帖子进行投票?您可能会点击+1或类似图片,然后在控制器上进行ajax发布,并返回JSON等。因此,现在您可以进入纯Rspec测试。
- 测试您的视图以确保显示+1图片,
- 测试您的控制器,使其在收到给定格式的给定ajax请求时(无论是快乐路径还是不快乐路径),其行为是否正确-如果收到无效的帖子ID,该情况发生了;如果用户一天用完了25个投票,该怎么办?它会正确增加投票数吗?)
- 测试您的JavaScript,使其在以正确的格式提供JSON blob时能够正确响应(它会更新+1图片以表明它已被使用吗?(在这里想想Google + ...)它是否显示了谢谢消息?等。 )
所有这些都不会影响行为-但是,当您完成了较低级别的测试后,对于如何对帖子进行投票就很难填写步骤定义了。它可能很简单click_link '+1'
。其余步骤是测试结果,同样应该直接进行。完成后,您便知道功能已完成并完成。如果必要的行为发生了变化,则可以调整功能,否则可以完全安全地调整实现代码。
我希望这是有道理的。这一切都让我无所适从,但我认为它证明了BDD和TDD之间的区别,以及为什么Cucumber和RSpec可以满足不同的需求。