如何在 xUnit 中为 class 构造函数创建单元测试?
How to create unit test for class constructor in xUnit?
说我有这个 class:
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
}
}
我之前的设计是Deposit方法参数中有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
class,删除 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);
说我有这个 class:
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
}
}
我之前的设计是Deposit方法参数中有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
class,删除 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);