c# - 如何在 xUnit 中为类构造函数创建单元测试?
问题描述
说我有这门课:
public class BankAccount : IBankAccount
{
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;
}
public void Deposit(BankTransaction bankTransaction)
{
if (bankTransaction.TransactionAmount <= 0)
{
throw new ArgumentException("Deposit failed. Transaction amount is more than account balance.");
}
this.Balance += bankTransaction.TransactionAmount;
// Insert transaction record at BankTransaction Repository class
}
}
我之前的设计是BankAccount
方法参数中的存款。通过这种设计,我可以为方法创建单元测试,Deposit
如下所示:
[Theory, MemberData(nameof(DepositShouldPass_Data))]
public void DepositShouldPass(BankAccount account, BankTransaction bankTransaction, BankAccount accountExpected)
{
// Act
_bankAccount.Deposit(account, bankTransaction);
// Assert
Assert.Equal(accountExpected.Balance, _bankAccount.Balance);
}
public static TheoryData<BankAccount, BankTransaction, BankAccount> DepositShouldPass_Data()
{
return new TheoryData<BankAccount, BankTransaction, BankAccount>
{
{
new BankAccount(123, 250.00M),
new BankTransaction(50.00M),
new BankAccount(123, 300.00M)
},
{
new BankAccount(321, 150.50M),
new BankTransaction(10.50M),
new BankAccount(321, 160.00M)
}
};
}
BankAccount
但是现在,我想通过删除BankAccount
方法中的方法参数来重新设计类Deposit
。有了这个新设计,我如何使用 xUnit 传递测试数据?其次是如何为我的构造函数创建单元测试?
解决方案
你可以试试这个:
var bankAccountNo = new Random().Next();
var balance = 0;
BankAccount TestCode() => new BankAccount(bankAccountNo, balance);
var exception = Assert.Throws<ArgumentException>(TestCode);
Assert.StartsWith("Create bank account failed. Balance should be more than zero.", exception.Message);
还有这个:
var bankAccountNo = new Random().Next();
var balance = new Random().Next();
var bankAccount = new BankAccount(bankAccountNo, balance);
Assert.Equal(bankAccountNo, bankAccount.BankAccountNo);
Assert.Equal(balance, bankAccount.Balance);
推荐阅读
- javascript - 想要重构/修改 Angular 项目中所需 JSON 格式的 API 响应
- android - 从 Wear 应用程序检查 Wear 设备是否已连接到手持设备,2021
- json - 可导出的 JSON 差异
- flutter - 谷歌地图初始相机位置未设置
- mysql - mysql 多行中连续日期的开始和结束日期
- typescript - 如何声明 T[K] 为 X 类型的函数参数类型的索引器类型,因此 t[k]=x 将是一个有效的表达式
- php - 警告:file_get_contents():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:1416F086:
- r - 根据当前值有条件地重命名单元格
- facebook - 登录错误 Facebook:“URL 被阻止:此重定向失败,因为重定向 URI 未在应用程序的客户端 OAuth 设置中列入白名单。”
- sql - 将来自两个表的 If/Case 连接的值插入到第三个表中