【问题标题】:Rspec/Sinatra Modular vs Classical stylesRspec/Sinatra 模块化与古典风格
【发布时间】:2016-05-25 01:32:29
【问题描述】:

在我将其重构为多个控制器/服务器之前,我的应用程序一切正常。

我相信我正在使用 Sinatra-Base 的模块化设置。我相信我已经正确定义了我的 Rack ENV。

我有问题。如果不在命令行中启动 Sinatra,我将无法运行 rspec。 当我通过注释掉“运行!”来解决这个问题时我的服务器文件底部的命令,当我尝试从命令行运行我的应用程序时,显然 Sinatra 不会启动。

这是我的文件结构:

app
   app.rb
   server.rb
   datamapper_setup.rb
    controllers
      new_users.rb
      sessions.rb
    views
      various.erb
      files.erb
    models
      user.rb
spec
   features
       feature_test_spec.rb
       other_feature_test_spec.rb
   units
       unit_test_spec.rb
   spec_helper.rb
config.ru
.rspec
Gemfile
Rakefile

这是我的 config.ru 文件

require './app/app.rb'

run MyApp

这是我的 app.rb 文件

ENV['RACK_ENV'] ||= 'development'
require 'rack'
require 'sinatra/base'
require 'sinatra/flash'
require 'sinatra/partial'


require_relative 'data_mapper_setup'

require_relative 'server'
require_relative 'controllers/new_users'
require_relative 'controllers/sessions'

这是我的服务器文件

class App < Sinatra::Base
  register Sinatra::Flash
  register Sinatra::Partial
  enable :sessions
  set :session_secret, 'super secret'
  set :partial_template_engine, :erb


  helpers do
    def session_user
      @session_user ||= User.get(session[:user_id])
    end
  end


  get '/' do
    @new_user = User.new
    erb :'user/index'
  end
#Here is where I am commenting out run! in order to be able to run rspec without starting Sinatra. 
# It doesn't work at all if I have => run! if app_file == $0 now, but used to work before the refactor when this line was in my app file.  

run!
end

在我的规范助手中:

ENV['RACK_ENV'] = 'test'

require File.join(File.dirname(__FILE__), '..', 'app/app.rb')
require './app/app.rb'

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

require 'database_cleaner'

require 'coveralls'
require 'simplecov'
require './app/data_mapper_setup.rb'
require './spec/web_helpers.rb'

SimpleCov.formatters = [
  SimpleCov::Formatter::HTMLFormatter,
  Coveralls::SimpleCov::Formatter
]
Coveralls.wear!


Capybara.app = App



RSpec.configure do |config|

  config.include SessionHelpers

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

  config.include Capybara::DSL

  config.expect_with :rspec do |expectations|

    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end


  config.mock_with :rspec do |mocks|

    mocks.verify_partial_doubles = true
  end

end

我所有的 rspec 测试都通过了。

我尝试过的...

  1. 各种不同的 config.ru 设置
  2. Spec_helper 与 require 'rack' 不同
  3. 检查我的机架环境在我的数据库中是隔离的
  4. 试图了解 Sinatra 模块化和 Sinatra 古典风格之间的区别(成功有限)

【问题讨论】:

  • 您能否详细说明为什么首先需要致电run!?当你把它注释掉时,你不能做什么?
  • 嗨@georgebrock - 需要运行!能够从我的命令行运行 Sinatra 并访问我的 localhost 端口。但是,在我每次运行测试时,都会导致 Rspec 运行 Sinatra。

标签: ruby rspec sinatra rack env


【解决方案1】:

每次调用.run! app.rb 文件都会导致您出现问题。

有两个很好的解决方案:

只有在直接运行app.rb时才调用.run

您可以避免在不需要时调用.run!,方法是将其包装在条件中以检查app.rb 文件是否已直接运行并且未由其他文件加载。看起来像这样:

class App < Sinatra::Base
  # …

  if __FILE__ == $0
    run!
  end
end

让我们分解一下:

  • __FILE__ 是当前文件的路径。
  • $0 是您从命令行运行的 Ruby 脚本的路径。

有了这个条件,从命令行运行ruby app.rb 将触发对.run! 的调用,但运行其他命令(如rackuprspec)将意味着$0 与@ 不匹配987654337@,所以永远不会调用.run!

通过rackup运行本地服务器

该问题的替代解决方案是完全删除对.run! 的调用,并使用rackup 命令启动本地开发服务器。

由于您已经有一个config.ru 文件,您应该能够在不带参数的情况下运行rackup 以获得正在运行的开发服务器。

这将是我的首选方法,因为这意味着如果您想向应用程序添加更多 rack middleware(例如,对用户进行身份验证或提供静态文件),您可以将它们添加到您的 config.ru 文件中。将在开发和生产中运行它们。

更多阅读

【讨论】:

  • 您好,乔治,感谢您的回答。问题是当我将 if 子句放在那里时,当我尝试运行测试时,Rspec 会从我的命令行启动 sinatra。
猜你喜欢
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多