我正在学习TDD和模拟,我想知道如何将一些对象添加到私有列表中以测试方法和属性。我的代码的基本部分如下:
public class Account
{
private List<Transaction> transactions = new List<Transaction>();
public decimal Balance
{
get
{
throw new NotImplementedException();
// Should be calculated by adding amounts of all transactions
// from private list
}
}
public void AddTransaction(Transaction transaction)
{
throw new NotImplementedException();
}
}
public class Transaction
{
public decimal Amount { get; set; }
public string Note { get; set; }
public DateTime DateTime { get; set; }
public Transaction(decimal amount, string note, DateTime dateTime)
{
Amount = amount;
Note = note;
DateTime = dateTime;
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试属性Balance,但是我不知道如何向列表中添加一些数据。我可以使用Mock来做到这一点,还是应该先为AddTransaction编写代码并在Balance测试中使用它?
您应该仅使用暴露给其使用者的公共“端点”来测试您的班级。
你的情况,这将是constructor,AddTransaction和Balance。您班上的责任是增加交易并计算余额。
因此,在测试中,您将添加事务并检查Balance返回的预期结果。AddTransaction该方法将通过Balance性能测试进行测试。
如果您通过首先编写测试来寻求解决方案,那么您就不必在意是否有私有列表或字典或其他东西。
例如第一次测试看起来像
var transaction = new Transaction(12.4m, "note", 12.January(2018));
var account = new Account();
account.AddTransaction(transaction);
account.Balance.Should().Be(12.4m);
Run Code Online (Sandbox Code Playgroud)
第二次测试
var transaction1 = new Transaction(50.00m, "note1", 12.January(2018));
var transaction2 = new Transaction(45.99m, "note2", 13.January(2018));
var transaction3 = new Transaction(4.01m, "note3", 14.January(2018));
var account = new Account();
account.AddTransaction(transaction1);
account.AddTransaction(transaction2);
account.AddTransaction(transaction3);
account.Balance.Should().Be(100.0m);
Run Code Online (Sandbox Code Playgroud)
可能在哪里实施
private decimal _balance;
public void AddTransaction(Transaction transaction)
{
_balance += transaction.Amount;
}
public decimal Balance => _balance;
Run Code Online (Sandbox Code Playgroud)
如您所见,类可以在没有列表的情况下实现。如果应用程序使用方法的Balance次数比AddTransaction方法多得多,则上述方法可能是有效的。
通过拥有对实现不了解的测试,您可以在不更改测试的情况下自由地重构测试中的类。
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |