У меня есть сервер 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?
Действие действительно работает, когда я использую обычный браузер, чтобы добраться до него.
Это приводит к сбою теста. 'NoMethodError: undefined method 'call' для nil: NilClass'. Что происходит от вызова 'request.env ['async.callback']. Call response' – Nerian
Нужна полная обратная связь, чтобы помочь. –
/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