您好我正在使用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。 知道如何覆盖我的自定义属性。提前谢谢。
答案 0 :(得分: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
帮助器,所以如果它的工作方式很好,那就太好了。否则,可能值得调整您的测试以明确期望返回的内容。
答案 1 :(得分:0)
@ awsm-sid您是否调试了代码?