xUnit เปรียบเทียบความเท่าเทียมกันของวัตถุ [ซ้ำกัน]

ฉันมีคลาสนี้พร้อมกับตัวสร้างของมัน

 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;
    }
}

ฉันได้สร้างการทดสอบหน่วย xunit เพื่อตรวจสอบความเท่าเทียมกันของวัตถุ

BankAccountTest ระดับสาธารณะ { BankAccount ส่วนตัว _bankAccount;

    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)
            }
        };
    }
}

เมื่อฉันรันการทดสอบ มันล้มเหลวโดยมีข้อผิดพลาด

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

ฉันลองด้วย Assert.True(accountExpected.Equals(_bankAccount)); แล้ว แต่ก็ยังไม่ประสบความสำเร็จ


person Steve    schedule 16.06.2020    source แหล่งที่มา
comment
สิ่งนี้ตอบคำถามของคุณหรือไม่? วิธีที่ดีที่สุดในการเปรียบเทียบวัตถุที่ซับซ้อนสองรายการ คุณสามารถซีเรียลไลซ์ทั้งสองรายการได้ตลอดเวลาและตรวจสอบสตริงผลลัพธ์   -  person Jawad    schedule 16.06.2020
comment
Google สำหรับ xunit compare two objects buildplease.com/pages/testing-deep-equalilty   -  person mjwills    schedule 16.06.2020
comment
ขอบคุณ. จัดการเพื่อแก้ไขโดยใช้ FluentAssertions accountExpected.Should().BeEquivalentTo(_bankAccount);. แต่ฉันยังนึกไม่ออกว่าจะแก้ปัญหาอย่างไรหากไม่มี FluentAssertions   -  person Steve    schedule 16.06.2020


คำตอบ (2)


คุณกำลังพยายามเปรียบเทียบสองวัตถุที่ไม่ใช่ Equatable! ใน C# เพื่อให้สามารถเปรียบเทียบสองวัตถุได้ พวกมันจะต้องเป็น Equatable หรืออีกนัยหนึ่งคลาสพื้นฐานต้องใช้ IEquatable หากคุณไม่ได้ใช้ IEquatable<T> สำหรับประเภทการอ้างอิง การตรวจสอบความเท่าเทียมกันจะตรวจสอบการอ้างอิงวัตถุเท่านั้น! (โปรดทราบว่าลักษณะการทำงานนี้จะแตกต่างกันไปตามประเภทค่า!)

ดังนั้นสิ่งที่คุณต้องทำคืออย่างใดอย่างหนึ่งต่อไปนี้ -

  1. ใช้ IEquatable สำหรับคลาส BackAccount ของคุณโดยทำตาม วิธีกำหนดค่าความเท่าเทียมกันสำหรับประเภท
  2. หรือคุณสามารถเปรียบเทียบแต่ละฟิลด์ทีละรายการ:
Assert.Equal(bankAccount1.Balance, bankAccount2.Balance)

นี่คือโพสต์บล็อกที่ดีเกี่ยวกับการยืนยันความเท่าเทียมกัน:

person Arin Ghazarian    schedule 16.06.2020

การยืนยันล้มเหลวเนื่องจากคุณกำลังเปรียบเทียบตำแหน่งการอ้างอิงวัตถุของคุณในหน่วยความจำ คุณควรยืนยันคุณสมบัติภายในวัตถุแทน

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