2016-10-30 27 views
5

Tôi có một cấu trúc JSON mà tôi muốn khớp với một phần tử lồng nhau duy nhất trong, trong khi bỏ qua các dữ liệu khác. JSON trông như thế này (tối thiểu):Kết hợp một phần RSpec với một băm lồng nhau

{ 
    "employee": { 
    "id": 1, 
    "jobs_count": 0 
    }, 
    "messages": [ "something" ] 
} 

Đây là những gì tôi đang sử dụng ngay bây giờ:

response_json = JSON.parse(response.body) 
expect(response_json).to include("employee") 
expect(response_json["employee"]).to include("jobs_count" => 0) 

Những gì tôi muốn làm là một cái gì đó như:

expect(response_json).to include("employee" => { "jobs_count" => 0 }) 

Thật không may, include yêu cầu đối sánh chính xác cho bất kỳ điều gì nhưng kiểm tra khóa cấp cao nhất đơn giản (ít nhất với cú pháp đó).

Có cách nào để đối sánh một phần mã băm lồng nhau trong khi bỏ qua phần còn lại của cấu trúc không?

Trả lời

4

Bạn có thể sử dụng và lồng phương pháp hash_including cho các đối sánh này.

Sử dụng ví dụ của bạn, bạn có thể viết lại mã kiểm tra của bạn trông giống như:

expect(response_json).to include(hash_including({ 
    employee: hash_including(jobs_count: 0) 
})) 

(hoặc nếu response_json là một đối tượng duy nhất, thay thế include với match)

này cũng sẽ làm việc khi giao dịch với Các ràng buộc .with, ví dụ:

expect(object).to receive(:method).with(hash_including(some: 'value')) 
Các vấn đề liên quan