期望JSON在rspec中只有一组特定的键?

bla*_*ost 7 ruby rspec ruby-on-rails

我正在测试JSON API,现在我这样做:

expect(json).to have_key('name')
expect(json).to have_key('age')
Run Code Online (Sandbox Code Playgroud)

我怎样才能确保JSON具有只是按键nameage,并没有其他的钥匙?

Aru*_*hit 7

使用#contain_exactly匹配器:

expect(json.keys).to contain_exactly('name', 'age')
Run Code Online (Sandbox Code Playgroud)

例子

1号

规格:

describe "Hash" do
  subject { {a: 2, b: 3} }

  it "passes" do
    expect(subject.keys).to contain_exactly(:a, :b)
  end
end
Run Code Online (Sandbox Code Playgroud)

我们来吧:

arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
.

Finished in 0.00227 seconds (files took 0.13131 seconds to load)
1 example, 0 failures
Run Code Online (Sandbox Code Playgroud)

2号

规格:

describe "Hash" do
  subject { {a: 2, b: 3} }

  it "fails" do
    expect(subject.keys).to contain_exactly(:a)
  end
end
Run Code Online (Sandbox Code Playgroud)

我们来吧:

arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
F

Failures:

  1) Hash fails
     Failure/Error: expect(subject.keys).to contain_exactly(:a)
       expected collection contained:  [:a]
       actual collection contained:    [:a, :b]
       the extra elements were:        [:b]
     # ./spec/test_spec.rb:7:in `block (2 levels) in <top (required)>'

Finished in 0.00243 seconds (files took 0.13206 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/test_spec.rb:6 # Hash fails
Run Code Online (Sandbox Code Playgroud)

数字#3

规格:

describe "Hash" do
  subject { {a: 2, b: 3, c: 4} }

  it "fails" do
    expect(subject.keys).to contain_exactly(:a, :b)
  end
end
Run Code Online (Sandbox Code Playgroud)

我们来吧:

arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
F

Failures:

  1) Hash fails
     Failure/Error: expect(subject.keys).to contain_exactly(:a, :b)
       expected collection contained:  [:a, :b]
       actual collection contained:    [:a, :b, :c]
       the extra elements were:        [:c]
     # ./spec/test_spec.rb:7:in `block (2 levels) in <top (required)>'

Finished in 0.00243 seconds (files took 0.13301 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/test_spec.rb:6 # Hash fails
arup@linux-wzza:~/Ruby>
Run Code Online (Sandbox Code Playgroud)

数字#4

处理JSON键时,splat operator(*)可以方便地管理参数列表.

规格:

describe "Hash" do
  subject { {a: 2, b: 3} }
  let(:json_keys) { %w{a b} }

  it "passes" do
    expect(subject.keys).to contain_exactly(*json_keys)
  end
end
Run Code Online (Sandbox Code Playgroud)

我们来吧:

arup@linux-wzza:~/Ruby> rspec spec/test_spec.rb
.

Finished in 0.00227 seconds (files took 0.13131 seconds to load)
1 example, 0 failures
Run Code Online (Sandbox Code Playgroud)