我可以做一个更短的铁路黄瓜防御?

时间:2011-05-15 16:26:16

标签: ruby-on-rails rspec 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也很陌生。但这对我来说似乎有点长,我不能让它更短吗?

3 个答案:

答案 0 :(得分:1)

当你用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

该步骤将寻找一个带有“图片”类的图像 - 我对应用程序上下文中图片的任意定义。

请注意,我在这里没有检查响应状态。黄瓜背后的想法(甚至比Rspec更多)是你从客户的角度测试事物。可以说你的客户端可能是一个客户端API,所以也许检查状态代码是合适的,但通常使用Web应用程序,你更关心UI,而失败的状态代码将以其他方式表现出来,例如一个破碎的UI。状态代码等详细信息通常是不应从BDD角度进行测试的实现细节(尽管 应在单元测试中进行测试。)

FWIW,我也不同意这样的断言:测试的长度应决定你是否应该使用Rspec或Cucumber。请参阅我关于此事的博文:http://collectiveidea.com/blog/archives/2011/04/15/language-matters/

答案 1 :(得分:1)

在你更熟悉Rails / Ruby之前,强烈建议不要使用Cucumber。 Cucumber增加了一定程度的抽象,可以使事情变得非常混乱,令人沮丧和耗时。先用RSpec搞定。然后,当您想在Rails应用程序上进行集成测试时,请使用Capybara和RSpec。当你习惯使用这些宝石时,你可以去黄瓜。

Cucumber是关于编写用户故事的。然后,您将这些Cucumber步骤转换为RSpec和Capybara的行。

答案 2 :(得分:0)

如果您正在寻求简洁,我建议坚持RSpec。 Cucumber的主要优势在于它对不编写代码的人的可读性,而RSpec为了缩短代码而牺牲了它。我尝试在我的一个项目中使用Lettuce,这是一个类似于Cucumber的python类似物,并且发现要跟上工作太多了。

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