首页 > 解决方案 > 如何使用 rspec 为序列化程序编写单元测试

问题描述

嗨,我正在使用 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

我已经为这两个序列化程序编写了单元测试,如下所示:-receipt_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

收据_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-railsrspec-rails

解决方案


你可以写

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

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


推荐阅读