2016-10-30 1 views
5

Ich habe eine JSON-Struktur, die ich ein einzelnes verschachteltes Element in übereinstimmen möchte, während andere Daten ignorieren. Die JSON sieht wie folgt aus (minimal):RSpec teilweise Übereinstimmung mit einem verschachtelten Hash

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

Hier ist, was ich jetzt bin mit:

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

Was ich möchte, ist zu tun, so etwas wie:

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

Leider include erfordert eine genaue Übereinstimmung für alles andere als eine einfache Schlüsselüberprüfung der obersten Ebene (zumindest mit dieser Syntax).

Gibt es eine Möglichkeit, einen verschachtelten Hash teilweise anzupassen, während der Rest der Struktur ignoriert wird?

Antwort

4

Sie können die Methode hash_including für diese Matcher verwenden und verschachteln.

Ihr Beispiel verwenden, können Sie Ihren Test-Code neu schreiben aussehen:

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

(oder wenn response_json ein einzelne Objekt ist, ersetzen include mit match)

Dies funktioniert auch, wenn sie mit dem Umgang .with Einschränkungen, zum Beispiel:

expect(object).to receive(:method).with(hash_including(some: 'value')) 
Verwandte Themen