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

#5 in Development tools

Download history 306410/week @ 2024-07-17 311881/week @ 2024-07-24 324920/week @ 2024-07-31 340001/week @ 2024-08-07 319165/week @ 2024-08-14 356057/week @ 2024-08-21 302892/week @ 2024-08-28 360058/week @ 2024-09-04 351450/week @ 2024-09-11 338502/week @ 2024-09-18 367029/week @ 2024-09-25 393094/week @ 2024-10-02 406904/week @ 2024-10-09 423758/week @ 2024-10-16 455300/week @ 2024-10-23 429180/week @ 2024-10-30

1,799,165 downloads per month
Used in 1,285 crates (125 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