【问题标题】:Setup Cucumber, Capybara and RSpec with Modular Sinatra application使用 Modular Sinatra 应用程序设置 Cucumber、Capybara 和 RSpec
【发布时间】:2011-08-25 11:26:59
【问题描述】:

这是我的config.ru

$:.unshift File.join(File.expand_path(File.dirname(__FILE__)), 'config')
require 'boot'

Routes = Rack::Mount::RouteSet.new do |set|
  set.add_route App::Users, { :path_info => %r{^/users*} }, {}, :users
  set.add_route App::Dashboard, { :path_info => %r{^/$} }, {}, :dashboard
  set.add_route Rack::File.new(File.dirname(__FILE__) + "/public"), { :path_info => %r{^/*} }, {}, :public
end

run Routes

boot.rb

require 'bundler'
Bundler.setup
Bundler.require(:default)
Mongoid.load!(File.join(File.dirname(__FILE__), '/mongoid.yml'))
%w(sinatra json yaml rack/mount rack/contrib).each {|l| require l }
Dir["./lib/**/*.rb"].each { |f| require f }

我的lib 包含应用程序和模型。

如何让 Cucumber 看到我的申请:

这是黄瓜env.rb

require 'capybara'
require 'capybara/cucumber'
require 'rspec'

World do
  Capybara.app = App
  include Capybara
  include RSpec::Expectations
  include RSpec::Matchers
end

我想要的是让 env.rb 读取我的 config.ru 并让我的黄瓜准备好进行测试。

【问题讨论】:

    标签: rspec cucumber sinatra capybara


    【解决方案1】:

    在@amrnt 的解决方案中,您可以替换该行

    Capybara.app = eval("Rack::Builder.new {( " + File.read(File.dirname(__FILE__) + '/../../config.ru') + "\n )}")
    

    用这个:

    Capybara.app, _ = Rack::Builder.parse_file(File.expand_path('../../config.ru', __FILE__))
    

    Capybara.app = Rack::Builder.parse_file(File.expand_path('../../config.ru', __FILE__)).first    
    

    【讨论】:

    • Rack::Builder.parse_file — 正是我想要的!
    • 谢谢,在将我的应用程序重构为模块化控制器后,我的 Capybara 测试工作正常。问题:为什么Capybara.app, _ = Rack::.... 有效而Capybara.app = Rack::.... 无效? , _ 是做什么的???
    • 评论大小受到严格限制...所以 tl;dr - 在 Ruby 和其他语言中,约定是在向您返回某些内容时使用 _,您不需要分配。例如:def foo; "bar", "baz"; end。抱歉没有块语法突出显示。如果您不需要分配“baz”,请使用qux, _ = foo。如果您确实需要两者,请照常执行qux, quz = foo。这里也是一样。 .parse_file returns two objects 所以如果你不需要第二个对象,你会使用_。这也经常发生在块 args 上。
    【解决方案2】:

    设置你的env.rb:

    ENV['RACK_ENV'] = 'test'
    require File.join(File.dirname(__FILE__), '..', '..', 'config/boot.rb')
    
    require 'capybara'
    require 'capybara/cucumber'
    require 'rspec'
    
    Capybara.app = eval("Rack::Builder.new {( " + File.read(File.dirname(__FILE__) + '/../../config.ru') + "\n )}")
    
    class SomeWorld
      include Capybara
      include RSpec::Expectations
      include RSpec::Matchers
    end
    
    World do
      SomeWorld.new
    end
    

    它会起作用的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-29
      • 2012-10-21
      • 1970-01-01
      • 2011-11-12
      • 2012-03-03
      相关资源
      最近更新 更多