xUnit 比较对象相等性

xUnit comparing object equality

我有这个 class 及其构造函数

 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 单元测试

public class BankAccountTest { 私人银行账户 _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)); 但仍然没有成功。

断言失败,因为您正在比较内存中的对象引用位置。相反,您应该断言对象内部的属性。

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

您正在尝试比较两个不是 Equatable 的对象!在 C# 中为了能够比较两个对象,它们需要是 Equatable,换句话说底层 class 必须实现 IEquatable,如果你不实现 [=13] =] 对于引用类型,相等性检查只会检查对象引用! (请注意,此行为对于值类型是不同的!)

所以你需要做的是以下任一 -

  1. 通过关注 How to define value equality for a type
  2. 为您的 BackAccount class 实施 IEquatable
  3. 或者,您可以一一比较各个字段:
Assert.Equal(bankAccount1.Balance, bankAccount2.Balance)

还有一篇关于相等性断言的好博客post: