【问题标题】:Using Cucumber With Modular Sinatra Apps将 Cucumber 与模块化 Sinatra 应用程序一起使用
【发布时间】:2019-07-23 05:52:27
【问题描述】:

我正在使用 Sinatra 构建一个中型应用程序,当我只有一个 app.rb 文件并且我在 Github 上按照 Aslak 的指导进行操作时,一切都很好:

https://github.com/cucumber/cucumber/wiki/Sinatra

随着应用程序变得越来越大,app.rb 文件开始膨胀,我使用 Sinatra::Base 将很多部分重构为“中间件”样式模块,使用机架文件映射事物( config.ru) 等。

该应用程序运行良好 - 但我的规范崩溃了,因为没有更多 app.rb 文件可供 webrat 运行(如上面的链接中所定义)。

我试图找到有关如何使用此功能的示例 - 我想我只是还不习惯 Cuke 的内部结构,因为我无法找到一种方法让它涵盖所有应用程序。我试着只指向“config.ru”而不是 app.rb——但这不起作用。

我最终做的——这完全是 hackish——是在我的支持目录中有一个单独的 app.rb 文件,其中包含所有需要的东西,所以我至少可以测试模型的东西。我也可以在那里指定路线 - 但这根本不是我想要做的。

所以 - 问题是:如何让 Cucumber 正确使用模块化应用程序方法?

【问题讨论】:

    标签: ruby cucumber sinatra


    【解决方案1】:

    更新包括处理多个 Sinatra 应用程序

    需要你的应用程序所在的文件并更改

      def app
        Sinatra::Application
      end
    

     def app
        Rack::Builder.new do
          map '/a' { run MyAppA }
          map '/b' { run MyAppB }
        end
      end
    

    然后正确地测试应用程序。

    例如,如果您在 config.ru 中定义了要测试的中间件,则可以将这些中间件加载到您的应用定义中。

    【讨论】:

    • 这是有道理的 - 但我有 3 个应用程序 - 这是我正在努力解决的部分。
    • 您可以将您的应用程序包装在 Rack::Builder 实例中。
    • 你是一个明星 - 非常接近......但它把我推向了正确的方向,谢谢你。我将在下面添加代码:)
    【解决方案2】:

    感谢 BaroqueBobcat 先生 - 当然,现在的答案似乎非常明显 :)。这是 env.rb (/features/support/env.rb):

    require 'sinatra'
    require 'test/unit'
    require 'spec/expectations'
    require 'rack/test'
    require 'webrat'
    require 'app1'
    require 'app2'
    require 'app3'
    
    Webrat.configure do |config|
      config.mode = :rack
    end
    
    class MyWorld
      require 'test/unit'
    
      set :environment, :test
    
      include Rack::Test::Methods
      include Webrat::Methods
      include Webrat::Matchers
    
      Webrat::Methods.delegate_to_session :response_code, :response_body, :response
    
      def app
        Rack::Builder.new do
          map '/' do
            run App1 #important - this is the class name
          end
          map '/app1' do
            run App2
          end
          map '/app2' do
            run App3
          end
        end
      end
    end
    
    World do
      MyWorld.new
    
    end
    

    【讨论】:

      【解决方案3】:

      https://gist.github.com/28d510d9fc25710192bc

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 2022-11-09
        • 1970-01-01
        • 2014-09-27
        相关资源
        最近更新 更多