Я пишу тест для метода в моем приложении application_controller.rb и не могу написать правильный тест. Приложение построено на Rails 3.2.17.Rspec Rails задает значение в объекте JSON
object.rb
def previously_purchased?
return JSON.parse(self.features)['key']['previously_purchased'] if self.features
end
application_controller.rb
def include_bar?
url_param = params[:keyword] || cookies[:keyword]
@keyword_object = Object.find_by_url(url_param)
if @keyword_object.previously_purchased? && !cookies[:prior_purchase]
@keyword_object = nil
return
end
end
factories.rb
factory: object do
url_param 'TEST'
end
application_controller_spec.rb
#this was the most recent test I tried
context 'URL parameter keyword is present or keyword cookie is present' do
context 'object is displayed only to previously purchased' do
before(:each) do
@saved_object = create :object
@other_object = JSON.parse(@saved_object.features)
@other_object['key']['previously_purchased'] = true
@new_object = @other_object.to_json
request.cookies[:prior_purchase] = 'sub'
get :index
end
it 'finds object' do
expect(assigns(:keyword_object)).to be_nil
end
end
end
это возвращает следующую ошибку
Failure/Error: @other_object = JSON.parse(@saved_nanobar.features)
TypeError: no implicit conversion of nil into String
, который имеет смысл, таким образом, как я был не в состоянии установить значение previously_purchased истина.
Я также попытался
context 'object is displayed only to previously purchased' do
before(:each) do
@saved_object = create :object
@saved_object.features['key']['previously_purchased'] = true
request.cookies[:prior_purchase] = 'sub'
get :index
end
it 'finds object' do
expect(assigns(:keyword_object)).to be_nil
end
end
Failure/Error: @saved_object.features['key']['previously_purchased'].to_json = true
NoMethodError: undefined method
[]»для ноль: NilClass`
Что я вроде понимаю, но не достаточно хорошо, чтобы исправить мой тест. Возможно, я отказался от конца или другого синтаксиса при формировании и написании моего вопроса, поэтому любезно имейте терпение.
Это блокировало меня долго, и я был бы признателен за любую помощь. Мне не удалось найти ресурсы, чтобы помочь мне в дальнейшем. Если вам нужно, чтобы я менял/уточнял свой вопрос или нуждался в дополнительной информации, дайте мне знать, и я получу право на это.
Почему у вас есть файл под названием 'object.rb'? «Объект» является основным классом Ruby и не должен иметь вещей, произвольно добавленных к нему. Также неясно, как факторы JSON здесь. Если вы получаете параметры, Rails проанализирует их для вас.Если вы сохраняете вещи в базе данных в формате JSON, вы можете использовать 'serialize' для обработки этого для вас. – tadman
это модель, и на самом деле это не имя object.rb, я просто изменил ее, чтобы сделать вопрос как можно более общим. Каждый объект имеет атрибуты столбцов, а один из атрибутов столбцов сохраняется как объект JSON. – Horatio
Я думаю, что вы здесь слишком общие, в нем отсутствует контекст. – tadman