본문 바로가기
Programming/.NET

[Xunit] Assert.Equal vs Assert.Equivalent

by 째스터 2024. 5. 28.
728x90

Assert.Equal의 경우 두 object가 같은지 확인한다. type, value 모두 같아야만 true를 리턴한다.
하지만 JSON deserialize 하는 객체의 비교, 배열 원소의 순서는 중요하지 않은 비교 등에서 value가 같은지 싶을 때가 있다.
이럴 때는 Assert.Equivalent를 사용하면 Assert.Equal 보다 좀 더 유연한 비교가 가능하다.

아래 예시 소스코드를 보면 더 이해가 쉬울 것이다.

using System.Text.Json;

namespace MyProject.Tests;

public class EquivalentTests
{
    [Fact]
    public void Test1()
    {
        int[] array1 = [1, 2, 3];
        int[] array2 = [2, 3, 1];

        Assert.Equal(array1, array2); // false
        Assert.Equivalent(array1, array2); //true
    }

    [Fact]
    public void Test2()
    {
        var test1 = new Test("1", "2", "3");
        var test2 = new Test("1", "2", "3");

        Assert.Equal(test1, test2); // false
        Assert.Equivalent(test1, test2); //true
    }

    public class Test(string? a, string? b, string? c)
    {
        public string? A { get; } = a;
        public string? B { get; } = b;
        public string? C { get; } = c;
    }

    [Fact]
    public void Test3()
    {
        var json1 = """
        {
            "Name": "John",
            "Age": 30,
            "Address": {
                "Street": "123 Main St",
                "City": "Anytown"
            }
        }
        """;
        var json2 = """
        {
            "Age": 30,
            "Name": "John",
            "Address": {
                "City": "Anytown",
                "Street": "123 Main St"
            }
        }
        """;

        Assert.Equal(JsonDocument.Parse(json1), JsonDocument.Parse(json2)); // false
        Assert.Equivalent(JsonDocument.Parse(json1), JsonDocument.Parse(json2)); // true
    }
}

728x90

댓글