2014-09-25 5 views
2

У меня есть сервер Rails, работающий на Thin и асинхронном контроллере. Я хотел бы, чтобы проверить его с помощью RSpec, но я получаю сообщение об ошибке:Каков правильный способ проверки действия контроллера Rails, использующего throw: async?

Failure/Error: get :access_token 
    ArgumentError: 
     uncaught throw :async 

Это пример кода:

class SampleController < ApplicationController 

    def sample 
    EM.defer do 
     render json: { response: 'Hello World' } 

     request.env['async.callback'].call response 
    end 

    throw :async 
    end 

end 

require 'spec_helper' 

describe SampleController, :type => :controller do 
    it "hello world" do 
    get :sample 
    expect(JSON.parse(response.body)[response]).to eq('Hello World') 
    end 
end 

Причина, почему я получаю эту ошибку, потому что: асинхронная может быть только обрабатывается тонким сервером. В ванильном контроллере Rails нет тонкого сервера.

Так пытались Capybara:

describe "GET /sample", type: feature do 
    it "hello world" do 
     visit sample_path 

     expect(JSON.parse(page.body)['response']).to eq('Hello World') 
    end 
    end 


    # In spec_helper.rb 
    Capybara.server do |app, port| 
    require 'rack/handler/thin' 
    Rack::Handler::Thin.run(app, :Port => port) 
    end 

Но я все еще получаю ту же ошибку. Я считаю, что это потому, что Thin нужно запускать в поточном режиме; и capybara не запускает его таким образом.

Каков правильный способ проверки действия контроллера, использующего throw: async?

Действие действительно работает, когда я использую обычный браузер, чтобы добраться до него.

ответ

3

Чтобы проверить асинхронное действие Ruby on Rails, реализованное с помощью Thin, вам нужно будет запустить тест с использованием Thin. В противном случае он потерпит неудачу или станет хрупким - если вы попытаетесь насмехаться.

Итак, давайте установить его с помощью Capybara:

В Gemfile:

gem 'thin' 
gem 'capybara' 
gem 'selenium-webdriver' 

В спецификации/rails_helper.rb:

require 'capybara/rails' 

Capybara.default_driver = :selenium 

Capybara.server do |app, port| 
    require 'rack/handler/thin' 
    Rack::Handler::Thin.run(app, :Port => port) 
end 

Это устанавливает драйвер водосвинку быть селеном, реальный браузер. Вторая часть настраивает сервер Capybara как Thin.

Испытание должно быть написано то, как это:

describe SampleController, :type => :feature do 
    it "my test" do 
    visit sample_path 
    expect(page).to have_content('Hello World') 
    end 
end 

И это будет сделать тест пройти.

-1

В тесте контроллера RSpec, попробуйте заменить

get :sample 

с

expect { get :sample }.to throw_symbol(:async) 

Это должно поймать его и предотвратить спецификации от падения. Он также проверяет, что контроллер асинхронный!

+0

Это приводит к сбою теста. 'NoMethodError: undefined method 'call' для nil: NilClass'. Что происходит от вызова 'request.env ['async.callback']. Call response' – Nerian

+0

Нужна полная обратная связь, чтобы помочь. –

+0

/Users/Nerian/projects/async_test/app/controllers/application_controller.rb:10:in 'block in example_async ': undefined метод' call' для nil: NilClass (NoMethodError) # из /Users/Nerian/.rvm/ gems/ruby-2.1.3/gems/eventmachine-1.0.3/lib/eventmachine.rb: 1037: в 'call ' # из /Users/Nerian/.rvm/gems/ruby-2.1.3/gems/eventmachine -1.0.3/lib/eventmachine.rb: 1037: in 'block in spawn_threadpool ' – Nerian

 Смежные вопросы

  • Нет связанных вопросов^_^