Ruby on rails 我可以再短一点吗?

Ruby on rails 我可以再短一点吗?,ruby-on-rails,rspec,cucumber,Ruby On Rails,Rspec,Cucumber,我开始学习cucumber,我已经编写了以下步骤定义,基本上是从我已经进行的rspec测试中复制的 Given /^There is a picture on the screen$/ do describe PagesController do describe "GET 'home'" do it "should be successful" do get 'home' response.should be_success

我开始学习cucumber,我已经编写了以下步骤定义,基本上是从我已经进行的rspec测试中复制的

Given /^There is a picture on the screen$/ do
  describe PagesController do
    describe "GET 'home'" do
      it "should be successful" do
        get 'home'
        response.should be_success
      end
    end
  end
end

现在我对Rails也很陌生。但这对我来说似乎有点长,我能不能再短一点呢?

如果你想要简洁,我建议你坚持RSpec。Cucumber的主要优势在于它对不编写代码的人的可读性,而RSpec为了缩短代码而牺牲了这一点。我试着在我的一个项目中使用类似于Cucumber的python,但发现它的工作量太大,无法跟上进度


因此,简而言之:如果您想编写更短的测试,请使用RSpec。如果您希望开发人员编辑您的测试,或者您正在团队中工作,请使用Cucumber。

使用Cucumber编写测试时,您正在做的是一个很大的反模式。当你看你所做的测试时,你的步骤还不够详细,你实际上正在经历至少两个不同的步骤,其中一个不是你想要测试的。更好的测试方法是:

Given I am on the home page
Then I should see a picture
如果您使用
features/support/paths.rb
中的默认路径帮助程序,那么安装capybara的web步骤时,您将获得免费的第一步。第二个是这样的:

Then "I should see a picture" do 
  page.should have_selector("img.picture")
end
这一步将查找一个带有“picture”类的图像,我对应用程序上下文中图片的任意定义

注意,我没有在这里检查响应状态。cucumber背后的想法(甚至比Rspec更重要)是从客户机的角度进行测试。可以说,您的客户机可能是一个客户机API,因此检查状态代码可能是合适的,但一般来说,对于web应用程序,您更关心UI,失败的状态代码会以其他方式表现出来,例如UI损坏。像状态代码这样的细节通常是实现细节,不应该从BDD的角度进行测试(尽管它们应该在单元测试中涵盖)


FWIW,我也不同意这样的说法,即测试的长度应该决定您应该使用Rspec还是Cucumber。请参阅我的博客文章:

强烈建议您在更熟悉Rails/Ruby之前不要使用Cucumber。Cucumber添加了一个抽象级别,这会使事情变得非常混乱、令人沮丧和耗时。首先要和RSpec打好交道。然后,当您想在Rails应用程序上进行集成测试时,请将Capybara与RSpec一起使用。当你习惯使用这些宝石时,你可以去Cucumber


Cucumber是关于编写用户故事的。然后将这些黄瓜步骤转换为RSpec和水豚的行

并不是我需要短期测试什么的,只是我担心我做错了什么,因为它看起来太长了。非常冗长,是的。但这是正确的方法。哇哈,不,似乎不是,我不能让这个测试变红。你能告诉我正确的方法是什么吗,karmajunkie?我切换到Webrat而不是rspec来进行步骤防御,这允许步骤的内容是:访问“/pages/home”响应。应该包含(“不存在的内容”)这一个不会变红。因此,如果有人遇到同样的问题,切换到webrat会有所帮助。但我仍然很好奇如何在这种情况下使用rspec。谢谢,我会去玩这个。我从来没有说过考试的时间长短会对任何选择产生任何影响,只是因为考试时间太长,做得太少,我担心我做错了什么,很明显我做错了。我指的是前面的答案中关于考试时间长短的那一点。:)你的回答很有帮助,但我总是遇到一些错误,这些错误对我来说似乎不合逻辑,也不符合你的例子。我没有更改生成的home.html.erb页面,因此它应该包含一个p标记。当我在浏览器中检查源代码或检查文件,但使用您提供的代码,page.should_selector(“p”)保持红色时,会出现此问题。。。我搞错什么了吗?“主页”是一个保留术语还是什么?也是一个调试提示,如果你在gems中添加launchy,你可以在cuke中的任何地方使用一个步骤“然后向我显示页面”,它会在浏览器中打开当前页面供你查看。在你的情况下,我会确保你确实加载了你想要的页面。根据我上面的评论,当你期望在/家时,你可能会去你的根路径。谢谢,但你可能已经猜到我在这里会很固执。我知道Cucumber的目标是什么,我想看看我能走多远。失败是一种选择,如果使用黄瓜开始消耗太多时间,我可以放弃它,坚持使用RSpec和水豚。