2014-11-25 3 views
0

Я использую webmocks с большим успехом, чтобы протестировать некоторые вызовы API в моем приложении. Однако один тест неожиданно проваливается. Метод, который работает с ошибкой, отлично работает с консолью в разработке, но в тесте RSpec бросает исключение.RSpec бросает NoMethodError `strip 'для Array при вызове ожидания

Метод испытания:

class MyClass 
    class << self 
    . . . 
    def get_internal_users 
     response = HTTParty.get(API_URL + '/internal_users.json') 
     return false unless response.code == 200 
     response.parsed_response.each { |user| user.symbolize_keys! } 
    end 

    end 
end 

В Rails консоли: MyClass.get_internal_users возвращает действительный массив хэшей.

Тест:

describe MyClass do 
    context 'admin overrides' do 
     before do 
     @internal_users = {"user_name"=>"test_user"},{"user_name"=>"test_user_2"} 
     stub_request(:get, API_URL + '/internal_users.json') 
     .to_return(:status => 200, :body => @internal_users, :headers => {}) 
     end 

     describe "fetch internal users" do 
     subject { MyClass.get_internal_users } 
     it { expect {subject}.to_not raise_error } 
     end 
    end 
    end 

Выполнение этого теста бросает следующее исключение:

Failure/Error: it { expect {subject}.to_not raise_error } 
     expected no Exception, got #<NoMethodError: undefined method `strip' for [{"user_name"=>"test_user"}, {"user_name"=>"test_user_2"}]:Array> 

И там. Комментирование it { expect {subject}.to_not raise_error } заставляет пройти тест.

У меня есть такое же ожидание на всем протяжении моего кода, хотя и он отлично работает. Что вызывает ожидание вызова полосы в массиве?

Я использую следующие библиотеки:

  • рельсы-4.0.3 RSpec-ядро-2.14.7
  • RSpec рельсы-2.14.1
  • RSpec-издевается-2.14.6
  • RSpec-ожидания-2.14.5
  • HTTParty-0.13.0
  • webmock-1.20.4

ОБНОВЛЕНИЕ Проблема заключается в конфликте с каким состоянием и webmock и httparty ожидают, что тело находится. Следуя трассировке стека. Я был в состоянии сделать ошибку «уйти» изменение этого метода в HTTParty перл:

# httparty-0.13.0/lib/httparty/parser.rb 
def parse 
    #body is an array, the return check is throwing the exception: 
    # return nil if body.nil? || body.strip.empty? || body == "null" 
    # allow arrays: 
    unless body.class == Array 
    return nil if body.nil? || body.strip.empty? || body == "null" 
    end 

    if supports_format? 
    parse_supported_format 
    else 
    body 
    end 
end 

Но я неохотно распространять этот драгоценный камень на всех серверах это приложение будет развернут.

ответ

0

Хорошо, что я не знал, была ли это проблемой httparty, проблемой веб-камеры, проблемой rspec или некоторым объединением трех. Я закончил отслеживание запроса в firebug и проверил заголовки ответов. У меня было мнение, что ContentType инструктирует httparty как анализировать ответ. Конечно же:

stub_request(:get, API_URL + '/internal_users.json') 
     .to_return(:status => 200, :body => @internal_users.to_json, :headers => {'Content-Type' => 'application/json; charset=utf-8'}) 

исправлено. Кто-то должен был поймать это, прежде чем я это сделал.

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