【问题标题】:How to write unit test for serializer using rspec如何使用 rspec 为序列化程序编写单元测试
【发布时间】:2018-05-06 11:16:40
【问题描述】:

您好,我正在使用 ruby​​-2.5.0 和 rails 5 开发一个 RoR 项目。我有两个模型 Receipt 和 Receipt Items。收据有_许多收据_项目。 收据序列化器:-

# frozen_string_literal: true

class ReceiptSerializer
  include JSONAPI::Serializer

  TYPE = 'reciept'
  attribute :name
  attribute :receipt_date
  attribute :address
  attribute :total_paid
  attribute :user_id

  attribute :receipt_date do
    object.receipt_date.strftime('%d/%m/%Y %H:%M:%S')
  end

  attribute :receipt_items do 
    object.receipt_items.map do |receipt_item|
      ::ReceiptItemSerializer.new(receipt_item).attributes
    end
  end
end

收据项序列化程序:-

# frozen_string_literal: true

class ReceiptItemSerializer
  include JSONAPI::Serializer

  TYPE = 'reciept_item'
  attribute :item_name
  attribute :quantity
  attribute :price

end

我已经为这两个序列化程序编写了单元测试,如下所示:- 收据_serializer_spec.rb

# frozen_string_literal: true

require 'rails_helper'

RSpec.describe ReceiptSerializer do
  let(:id) { 1 }
  let(:user_id) { 1 }
  let(:name) { 'IGA' }
  let(:address) { 'address' }
  let(:total_paid) { '100' }
  let(:receipt_date) { '12/04/2018 15:36:00' }
  let(:receipt) do
    Receipt.new(
      user_id: user_id,
      name: name,
      address: address,
      total_paid: total_paid,
      receipt_date: receipt_date
    )
  end

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

  it { is_expected.to have_jsonapi_attributes('user-id' => user_id) }

  it { is_expected.to have_jsonapi_attributes('address' => address) }

  it { is_expected.to have_jsonapi_attributes('total-paid' => total_paid) }

  it { is_expected.to have_jsonapi_attributes('receipt-date' => receipt_date) }

  it { is_expected.to have_jsonapi_attributes('receipt-date' => receipt_date) }
end

receipt_item_serializer_spec.rb

# frozen_string_literal: true

require 'rails_helper'

RSpec.describe ReceiptSerializer do
  let(:receipt_id) { 1 }
  let(:item_name) { 'ABC' }
  let(:quantity) { 1 }
  let(:price) { '100' }
  let(:receipt_item) do
    ReceiptItem.new(
      receipt_id: receipt_id,
      item_name: item_name,
      quantity: quantity,
      price: price
    )
  end

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

  it { is_expected.to have_jsonapi_attributes('item-name' => item_name) }

  it { is_expected.to have_jsonapi_attributes('quantity' => quantity) }

  it { is_expected.to have_jsonapi_attributes('price' => price) }
end

现在我不知道如何为在receipt_serializer.rb 中定义的receipt_items 属性编写单元测试。请帮我。提前致谢。

【问题讨论】:

    标签: ruby-on-rails rspec-rails


    【解决方案1】:

    你可以写

    it "serializes the receipt" do
      expect(subject).to include('item-name' => 'ABC', 'item-price' => '100') # ... etc
    end
    

    如果您已经在单独测试所有属性的存在,不确定测试是否有巨大的价值。

    【讨论】:

    • 谢谢,但我关心的是只测试receipt_items 属性。属性:receipt_items do object.receipt_items.map do |receipt_item| ::ReceiptItemSerializer.new(receipt_item).attributes end end
    • 由于这个属性,我的测试没有覆盖 100%
    【解决方案2】:

    我希望这个宝石对你有用https://github.com/collectiveidea/json_spec

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多