Как написать модульный тест, используя rspec для сериализатора с пользовательскими атрибутами - PullRequest
0 голосов
/ 10 июня 2018

Привет, я работаю над проектом RoR с ruby-2.5.0 и rails 5. Я использую jsonapi-сериализаторы для моего API.У меня есть сериализатор с пользовательским атрибутом следующим образом: -

class ReceiptPartialSerializer
  include JSONAPI::Serializer

  TYPE = 'receipt'
  attribute :id
  attribute :receipt_partials

  attribute :receipt_partials do
    receipt_container = []
    object.receipt_partials.each do |partial|
      receipt_partial = {}
      receipt_partial['id'] = partial.id
      receipt_partial['image_url'] = 'https:' + partial&.picture&.url
      receipt_container << receipt_partial
    end
    receipt_container
  end
end

Мой файл спецификаций для этого сериализатора: -

RSpec.describe ReceiptPartialSerializer do
  let(:id) { 1 }
  let(:image_url) { 'https:/images/original/missing.png' }
  let(:receipt_id) { 1 }
  let(:receipt_partial) do
    ReceiptPartial.new(
      receipt_id: receipt_id
    )
  end

  subject { JSONAPI::Serializer.serialize(receipt_partial) }

  it { is_expected.to have_jsonapi_attributes('image-url' => image_url) }
end

Но когда я запускаю свой тест, он не покрывает мой пользовательский атрибуткоторый является квитанциейenter image description here Любая идея, как я могу покрыть свой собственный атрибут.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 июня 2018

@ awsm-sid Вы отлаживали код?

0 голосов
/ 13 июня 2018

Похоже, вы тестируете только один атрибут вашего сериализатора - image-url.Вы пытались добавить ожидание того, что возвращает receipt_partial?Вы можете сохранить частичную квитанцию ​​в методе в своем тесте, используя что-то вроде:

def receipt_partial
  @receipt_partial ||= ReceiptPartial.new(receipt_id: receipt_id)
end

, а затем обновить тест, чтобы он выглядел следующим образом:

describe ReceiptPartialSerializer do
  let(:id) { 1 }
  let(:image_url) { 'https:/images/original/missing.png' }
  let(:receipt_id) { 1 }
  let(:receipt_partial) { receipt_partial }

  subject { JSONAPI::Serializer.serialize(receipt_partial) }

  it { is_expected.to have_jsonapi_attributes('image-url' => image_url) }
  it { is_expected.to have_jsonapi_attributes('receipt_partial' => receipt_partial) }

  def receipt_partial
    @receipt_partial ||= ReceiptPartial.new(receipt_id: receipt_id)
  end
end

Вы захотитепроверьте, принимает ли have_jsonapi_attributes массив, и если это так, вы можете объединить этот оператор ожидания в одно большое ожидание всех аргументов вашего сериализатора.

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

...