Я использую 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
Но я неохотно распространять этот драгоценный камень на всех серверах это приложение будет развернут.