使用RSpec匹配JSON参数和多个参数的最佳方式是什么



我正在为Ruby类编写规范,该类将给定的ActiveRecord转换为JSON,并将JSON传递给另一个类。

include KinesisHelper
class OrderProcesser
class << self
def post_order(order)
json = extract_order_params(order)
KinesisHelper.send_record_to_kinesis(json, order.stream)
end
private
def extract_order_params(order)
params = {}
params[:id] = order.id
params[:max_budget] = order.budget
params[:startDate] = order.start_date.to_i * 1000
params[:endDate] = order.end_date.to_i * 1000
params.to_json
end

在RSpec中,我想验证subject类是否以正确的格式创建JSON,并使用正确的参数调用其组件类。这是我的尝试。

require 'spec_helper'
describe OrderProcesser do
describe "#perform" do
before do
@order = FactoryBot.create(:order)
end
it "should invoke OrderProcesser" do
# working
#KinesisHelper.should_receive(:send_record_to_kinesis).once.with(anything, @order.stream)
#partially working - only first condition is verified
expect(KinesisHelper).to receive(:send_record_to_kinesis) {
|arg1, arg2|
expect(arg2).to eq @order.stream
expect(arg1[:id]).to eq @order.id
}
#when
OrderProcesser.post_order(@order)
end
end
end

通用验证通过:

KinesisHelper.should_receive(:send_record_to_kinesis).once.with(anything, @order.stream)

然而,当我尝试验证参数上的多个条件时,比如JSON内容和第二个参数的值,它只检查第一个条件。第二个条件被忽略。

expect(KinesisHelper).to receive(:send_record_to_kinesis) {
|arg1, arg2|
expect(arg2).to eq @order.stream
expect(arg1[:id]).to eq @order.id #ignored
}

你能告诉我如何在论点上运行多个匹配器吗?

该问题与多个匹配无关。我的代码中的错误是我没有将JSON字符串参数解析为JSON。在访问JSON属性时,我还使用了符号值。在JSON转换之后,这些符号将被eb转换为文本字符串。

此代码片段有效:

expect(KinesisHelper).to receive(:send_record_to_kinesis) {
|arg1, arg2|
expect(arg2).to eq @order.stream
json = JSON.parse(arg1)
expect(json['id']).to eq @order.id 
}

相关内容

  • 没有找到相关文章

最新更新