Sinatra + Rspec2 — использовать сеансы/помощники?

Я пытаюсь протестировать свое приложение Sinatra с помощью Rspec2, но не могу получить доступ к сеансам или вспомогательным методам в своих тестах.

spec_helper:

require File.dirname(__FILE__) + "/../myapp.rb"
require 'rubygems'
require 'sinatra'
require 'rack/test'
require 'rspec'
require 'factory_girl'

set :environment, :test

RSpec.configure do |conf|
  conf.include Rack::Test::Methods
end

def app
  Sinatra::Application
end

app_spec.rb:

require File.dirname(__FILE__) + "/../spec_helper.rb"

describe 'Something' do

  it "should do something" do
    session["aa"] = "Test" 
  end

end

Это выдает ошибку, не удается найти переменные сеанса. Точно так же я не могу использовать вспомогательные методы, определенные в моем приложении.

Я запускаю свои тесты, используя rspec specs/app_spec/app_spec.rb.

Что я делаю неправильно?


person Pogopuschel    schedule 14.09.2011    source источник


Ответы (1)


Предполагая, что у вас есть спецификации и помощник спецификации в каталоге /spec, тогда эта строка должна идти вверху вашей спецификации:

require_relative "./spec_helper.rb"

Мне также нравится использовать File.expand_path и File.join, так как это более надежно, чем делать это самостоятельно, например.

require File.dirname(__FILE__) + "/../spec_helper.rb"

становится

require_relative File.expand_path( File.join File.dirname(__FILE__), "/../spec_helper.rb" )

Кроме того, я не склонен к require "sinatra", в приложении это есть. Если вам не хватает битов из Sinatra, то, возможно, но вместо этого я добавляю такие вещи через стойку:

ENV['RACK_ENV'] = 'test'

Наконец, если ваше приложение Sinatra использует модульный стиль, вам также придется включить его. Я делаю это в верхней части спецификации, например:

describe "The site" do
  include Rack::Test::Methods
  include MyApp
  let(:app) { MyApp.app  }

YMMV. Дайте нам знать, если что-то из этого работает.


Другой тест, чтобы попробовать:

before(:all) { get "/" }
subject { last_response }
it { should be_ok }
person iain    schedule 14.09.2011
comment
Спасибо за ответ. Файл spec_helper.rb включен правильно (я могу получить доступ к другим вещам, определенным в нем), проблема не в этом. Я не использую модульный стиль. Любые другие идеи? - person Pogopuschel; 14.09.2011
comment
Я бы попробовал переместить объявление include Rack::Test::Methods и приложения в спецификацию и посмотреть, работает ли это. Вы можете сначала попробовать другой тип теста, чтобы убедиться, что он работает, вместо того, чтобы переходить к материалам сеанса, см. Мое редактирование. - person iain; 14.09.2011
comment
Кстати, только что понял (лицо ладони!) Использование Rack::Test действительно для интеграционных тестов, поэтому вы все равно не будете напрямую обращаться к помощникам или сеансам. Прочтите этот пост о помощниках по тестированию japhr.blogspot.com/2009/03/ sinatra-innards-deletgator.html - person iain; 14.09.2011
comment
Спасибо, я пробовал это раньше, но это не помогло с использованием переменных сеанса. - person Pogopuschel; 15.09.2011
comment
О да, базовые тесты (например, тот, который вы опубликовали) работают нормально, я просто не могу получить доступ к сеансу[..] - person Pogopuschel; 15.09.2011
comment
почему вы хотите получить доступ к сеансу напрямую? - person iain; 16.09.2011