xUnit membandingkan kesetaraan objek [duplikat]

Saya memiliki kelas ini dengan konstruktornya

 public class BankAccount
    {
    public int Id { get; private set; }
    public int BankAccountNo { get; private set; }
    public decimal Balance { get; private set; }

    public BankAccount(int BankAccountNo, decimal Balance)
    {
        this.BankAccountNo = BankAccountNo;

        if(Balance <= 0)
        {
            throw new ArgumentException("Create bank account failed. Balance should be more than zero.");
        }

        this.Balance = Balance;
    }
}

Saya telah membuat pengujian unit xunit untuk memeriksa kesetaraan objek

Tes Rekening Bank kelas publik { Rekening Bank swasta _Rekening Bank;

    public BankAccountTest()
    {
        _bankAccount = new BankAccount();
    }

    [Theory, MemberData(nameof(BankAccountConstructorShouldPass_Data))]
    public void BankAccountConstructorShouldPass(BankAccount account, BankAccount accountExpected)
    {
        // Act
        _bankAccount = new BankAccount(account.BankAccountNo, account.Balance);

        // Assert
        Assert.Equal<BankAccount>(accountExpected,_bankAccount);
    }

    public static TheoryData<BankAccount, BankAccount> BankAccountConstructorShouldPass_Data()
    {
        return new TheoryData<BankAccount, BankAccount>
        {
            {
                new BankAccount(123, 250.00M),        
                new BankAccount(123, 250.00M)
            },
            {
                new BankAccount(321, 150.50M),       
                new BankAccount(321, 150.50M)
            }
        };
    }
}

Saat saya menjalankan tes, gagal karena kesalahan

Assert.Equal() Failure
Expected: BankAccount { Balance = 250.00, BankAccountNo = 123, Id = 0 }
Actual:   BankAccount { Balance = 250.00, BankAccountNo = 123, Id = 0 }

Saya mencoba dengan Assert.True(accountExpected.Equals(_bankAccount)); tetapi masih belum berhasil.


person Steve    schedule 16.06.2020    source sumber
comment
Apakah ini menjawab pertanyaan Anda? Cara terbaik untuk membandingkan dua objek kompleks. Anda selalu dapat membuat serialisasi keduanya dan memeriksa string yang dihasilkan   -  person Jawad    schedule 16.06.2020
comment
Google untuk xunit compare two objects. buildplease.com/pages/testing-deep-equalilty   -  person mjwills    schedule 16.06.2020
comment
Terima kasih. Berhasil menyelesaikannya menggunakan FluentAssertions. accountExpected.Should().BeEquivalentTo(_bankAccount);. Tapi, saya belum tahu bagaimana menyelesaikannya tanpa FluentAssertions.   -  person Steve    schedule 16.06.2020


Jawaban (2)


Anda mencoba membandingkan dua objek yang bukan Equatable! Di C# agar dapat membandingkan dua objek, objek tersebut harus Equatable, dengan kata lain kelas yang mendasarinya harus mengimplementasikan IEquatable, jika Anda tidak mengimplementasikan IEquatable<T> untuk tipe referensi, pemeriksaan kesetaraan hanya akan memeriksa referensi objek! (perhatikan bahwa perilaku ini berbeda untuk tipe nilai!)

Jadi yang perlu Anda lakukan adalah salah satu dari hal berikut -

  1. Terapkan IEquatable untuk kelas BackAccount Anda dengan mengikuti Cara mendefinisikan kesetaraan nilai untuk suatu tipe
  2. Alternatifnya, Anda dapat membandingkan masing-masing bidang satu per satu:
Assert.Equal(bankAccount1.Balance, bankAccount2.Balance)

Berikut ini juga postingan blog yang bagus tentang penegasan kesetaraan:

person Arin Ghazarian    schedule 16.06.2020

Penegasan gagal karena Anda membandingkan lokasi referensi objek di memori. Sebaliknya Anda harus menegaskan properti di dalam objek.

https://medium.com/@pjbgf/asserting-equality-in-your-c-unit-tests-837b423024bf#:~:text=Equal(expected.Name%2C%20actual,object%20within%20the%20memory%20heap.

person Jeff    schedule 16.06.2020