【问题标题】:How to write unit test using rspec for serializer with custom attributes如何使用 rspec 为具有自定义属性的序列化程序编写单元测试
【发布时间】:2018-06-10 07:50:48
【问题描述】:

您好,我正在使用 ruby​​-2.5.0 和 rails 5 开发一个 RoR 项目。我正在为我的 api 使用 jsonapi-serializers。我有一个带有自定义属性的序列化程序,如下所示:-

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

但是当我运行我的测试时,它不包括我的自定义属性,即receipt_partials。 知道如何覆盖我的自定义属性。提前致谢。

【问题讨论】:

    标签: ruby-on-rails rspec-rails jsonapi-serialize


    【解决方案1】:

    看起来您只是在测试序列化程序的一个属性——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 是否接受一个数组,如果接受,您可以将该期望语句合并为所有序列化程序参数的一个大期望。

    另外,根据我的回答here,我认为应该对序列化程序进行测试,明确期望返回的内容,而不是测试是否包含给定的属性。这是我第一次看到have_jsonapi_attributes 助手,所以如果这是有效的方式,那就太好了。否则,可能值得调整您的测试以明确期望返回的内容。

    【讨论】:

    • 感谢您的帮助,但我已经通过改变方法解决了我的问题 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多