11 releases (stable)

2.0.2 Jun 29, 2022
2.0.1 Feb 14, 2021
2.0.0 Jan 23, 2021
1.1.0 Jul 12, 2020
0.2.1 Nov 17, 2018

#6 in Development tools

Download history 308758/week @ 2024-08-03 348401/week @ 2024-08-10 356623/week @ 2024-08-17 331230/week @ 2024-08-24 315010/week @ 2024-08-31 360589/week @ 2024-09-07 325132/week @ 2024-09-14 371528/week @ 2024-09-21 369276/week @ 2024-09-28 424196/week @ 2024-10-05 392697/week @ 2024-10-12 445408/week @ 2024-10-19 443204/week @ 2024-10-26 453027/week @ 2024-11-02 445208/week @ 2024-11-09 372832/week @ 2024-11-16

1,794,818 downloads per month
Used in 1,302 crates (126 directly)

MIT license

43KB
884 lines

Crates.io Docs dependency status Build status maintenance-status

assert-json-diff

This crate includes macros for comparing two serializable values by diffing their JSON representations. It is designed to give much more helpful error messages than the standard assert_eq!. It basically does a diff of the two objects and tells you the exact differences. This is useful when asserting that two large JSON objects are the same.

It uses the serde and serde_json to perform the serialization.

Partial matching

If you want to assert that one JSON value is "included" in another use assert_json_include:

use assert_json_diff::assert_json_include;
use serde_json::json;

let a = json!({
    "data": {
        "users": [
            {
                "id": 1,
                "country": {
                    "name": "Denmark"
                }
            },
            {
                "id": 24,
                "country": {
                    "name": "Denmark"
                }
            }
        ]
    }
});

let b = json!({
    "data": {
        "users": [
            {
                "id": 1,
                "country": {
                    "name": "Sweden"
                }
            },
            {
                "id": 2,
                "country": {
                    "name": "Denmark"
                }
            }
        ]
    }
});

assert_json_include!(actual: a, expected: b)

This will panic with the error message:

json atoms at path ".data.users[0].country.name" are not equal:
    expected:
        "Sweden"
    actual:
        "Denmark"

json atoms at path ".data.users[1].id" are not equal:
    expected:
        2
    actual:
        24

assert_json_include allows extra data in actual but not in expected. That is so you can verify just a part of the JSON without having to specify the whole thing. For example this test passes:

use assert_json_diff::assert_json_include;
use serde_json::json;

assert_json_include!(
    actual: json!({
        "a": { "b": 1 },
    }),
    expected: json!({
        "a": {},
    })
)

However expected cannot contain additional data so this test fails:

use assert_json_diff::assert_json_include;
use serde_json::json;

assert_json_include!(
    actual: json!({
        "a": {},
    }),
    expected: json!({
        "a": { "b": 1 },
    })
)

That will print

json atom at path ".a.b" is missing from actual

Exact matching

If you want to ensure two JSON values are exactly the same, use assert_json_eq.

use assert_json_diff::assert_json_eq;
use serde_json::json;

assert_json_eq!(
    json!({ "a": { "b": 1 } }),
    json!({ "a": {} })
)

This will panic with the error message:

json atom at path ".a.b" is missing from lhs

Further customization

You can use assert_json_matches to further customize the comparison.

License: MIT

Dependencies

~0.5–1MB
~20K SLoC