如何使用rspec为具有自定义属性的序列化程序编写unit testing

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

我的序列化程序的spec文件是: –

 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。 在此处输入图像描述 我知道如何覆盖我的自定义属性。 提前致谢。

看起来您只测试了序列化程序的一个属性 – 即image-url 。 您是否尝试过对receipt_partial返回的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帮助器,所以如果这是有效的方式,那就太好了。 否则,可能值得调整您的测试以明确期望返回的内容。

@ awsm-sid您是否调试了代码?

Interesting Posts