2016-10-25 4 views
1

Я пишу тест для метода в моем приложении 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`

Что я вроде понимаю, но не достаточно хорошо, чтобы исправить мой тест. Возможно, я отказался от конца или другого синтаксиса при формировании и написании моего вопроса, поэтому любезно имейте терпение.

Это блокировало меня долго, и я был бы признателен за любую помощь. Мне не удалось найти ресурсы, чтобы помочь мне в дальнейшем. Если вам нужно, чтобы я менял/уточнял свой вопрос или нуждался в дополнительной информации, дайте мне знать, и я получу право на это.

+0

Почему у вас есть файл под названием 'object.rb'? «Объект» является основным классом Ruby и не должен иметь вещей, произвольно добавленных к нему. Также неясно, как факторы JSON здесь. Если вы получаете параметры, Rails проанализирует их для вас.Если вы сохраняете вещи в базе данных в формате JSON, вы можете использовать 'serialize' для обработки этого для вас. – tadman

+0

это модель, и на самом деле это не имя object.rb, я просто изменил ее, чтобы сделать вопрос как можно более общим. Каждый объект имеет атрибуты столбцов, а один из атрибутов столбцов сохраняется как объект JSON. – Horatio

+0

Я думаю, что вы здесь слишком общие, в нем отсутствует контекст. – tadman

ответ

0

Ваш object.features должен содержать JSON. Настройка вашего объекта, как это:

@saved_object = create(
    :object, features: "{ \"key\": { \"previously_purchased\": true} }" 
) 
+0

спасибо! это сработало красиво !! – Horatio

0

Если столбец Сохранённые в формате JSON, вы должны использовать serialize, который будет заботиться о всех беспорядке:

class MyModel < ActiveRecord::Base 
    serialize :features, JSON 
end 

Затем вы можете управлять этим, как и любой другой структуры без необходимости вручную отменить или повторно сериализация:

model = MyModel.new 
model.features = { key: { previously_purchased: true } } 
model.save 

Тогда вы можете сделать это:

def previously_purchased? 
    if (self.features) 
    !!self.features.dig('key', 'previously_purchased') 
    else 
    false 
    end 
end 

Это использует двойное отрицание (!!), чтобы заставить это значение использовать как логическое, так и Ruby 2.3.1 dig метод навигации по хэшу.

+0

Мне это нравится, это действительно чисто. Я буду реорганизовать свои методы аналогичным образом. – Horatio

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