我有一个Model方法,在执行时返回以下内容。
{"data" => [
{"product" => "PRODUCTA", "orders" => 3, "ordered" => 6, "revenue" => 600.0},
{"product" => "PRODUCTB", "orders" => 1, "ordered" => 5, "revenue" => 100.0}]}
我想测试以确保第一个哈希中的“收入”存在,然后测试该值是否等于600。
subject { described_class.order_items_by_revenue }
it "includes revenue key" do
expect(subject).to include(:revenue)
end
我完全迷失了如何使用Rspec进行测试。
RSpec允许您使用 have_key 谓词匹配器验证密钥的存在 has_key?
,像这样:
subject { described_class.order_items_by_revenue }
it "includes revenue key" do
expect(subject.first).to have_key(:revenue)
end
RSpec允许您使用 have_key 谓词匹配器验证密钥的存在 has_key?
,像这样:
subject { described_class.order_items_by_revenue }
it "includes revenue key" do
expect(subject.first).to have_key(:revenue)
end
如果你明确想要测试 只要 该 第一个哈希 在您的数组映射到 :data
,这是你的 expect
给出你上面写的内容:
data = subject[:data].first
expect(data).not_to be_nil
expect(data.has_key?(:revenue)).to be_truthy
expect(data[:revenue]).to eq 600
或者,对于第二个期望,您可以使用 expect(data).to have_key(:revenue)
正如Chris Heald指出的那样 他的回答 其中有一个更好的失败消息,如评论中所示。
- 第一个“期望”测试,如果主题有 第一个哈希。 (您可以交替测试阵列是否
empty?
)
- 下一个期望是测试是否 第一个哈希 有钥匙
:revenue
- 最后的期望测试是否 第一个哈希
:revenue
值等于600
你应该 阅读RSpec,它是一个非常强大和有用的测试框架。
这个问题可以通过使用适当类型的值存在的密钥测试每个哈希来解决。例如:
describe 'GetCatsService' do
subject { [{ name: 'Felix', age: 25 }, { name: 'Garfield', age: 40 }] }
it { is_expected.to include(include(name: a_kind_of(String), age: a_kind_of(Integer)))}
end
# GetCatsService
# should include (include {:name => (a kind of String), :age => (a kind of Integer)})