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));
但仍然没有成功。
断言失败,因为您正在比较内存中的对象引用位置。相反,您应该断言对象内部的属性。
您正在尝试比较两个不是 Equatable
的对象!在 C# 中为了能够比较两个对象,它们需要是 Equatable
,换句话说底层 class 必须实现 IEquatable,如果你不实现 [=13] =] 对于引用类型,相等性检查只会检查对象引用! (请注意,此行为对于值类型是不同的!)
所以你需要做的是以下任一 -
- 通过关注 How to define value equality for a type
为您的 BackAccount
class 实施 IEquatable
- 或者,您可以一一比较各个字段:
Assert.Equal(bankAccount1.Balance, bankAccount2.Balance)
还有一篇关于相等性断言的好博客post:
我有这个 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));
但仍然没有成功。
断言失败,因为您正在比较内存中的对象引用位置。相反,您应该断言对象内部的属性。
您正在尝试比较两个不是 Equatable
的对象!在 C# 中为了能够比较两个对象,它们需要是 Equatable
,换句话说底层 class 必须实现 IEquatable,如果你不实现 [=13] =] 对于引用类型,相等性检查只会检查对象引用! (请注意,此行为对于值类型是不同的!)
所以你需要做的是以下任一 -
- 通过关注 How to define value equality for a type 为您的
- 或者,您可以一一比较各个字段:
BackAccount
class 实施 IEquatable
Assert.Equal(bankAccount1.Balance, bankAccount2.Balance)
还有一篇关于相等性断言的好博客post: