【问题标题】:xUnit comparing object equality [duplicate]xUnit比较对象相等性[重复]
【发布时间】:2020-06-16 01:36:26
【问题描述】:

我有这个类和它的构造函数

 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;

    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));,但仍然没有成功。

【问题讨论】:

标签: c# xunit


【解决方案1】:

您正在尝试比较两个不是Equatable 的对象!在C#中为了能够比较两个对象,它们需要是Equatable,换句话说,底层类必须实现IEquatable,如果你不为引用类型实现IEquatable&lt;T&gt;,则进行相等检查只需检查对象引用! (请注意,这种行为对于值类型是不同的!)

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

  1. 按照How to define value equality for a type 为您的BackAccount 类实现IEquatable
  2. 或者,您可以逐个比较各个字段:
Assert.Equal(bankAccount1.Balance, bankAccount2.Balance)

还有一篇关于平等断言的好博文:

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多