添加到私有列表以进行TDD单元测试

1 c# tdd unit-testing mocking

我正在学习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测试中使用它?

Fab*_*bio 5

您应该仅使用暴露给其使用者的公共“端点”来测试您的班级。
你的情况,这将是constructorAddTransactionBalance。您班上的责任是增加交易并计算余额。
因此,在测试中,您将添加事务并检查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方法多得多,则上述方法可能是有效的。

通过拥有对实现不了解的测试,您可以在不更改测试的情况下自由地重构测试中的类。