Добавление в приватный список для юнит-тестов с TDD - PullRequest
0 голосов
/ 06 мая 2018

Я изучаю 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;
    }
}

Я бы хотел протестировать свойство Balance, но не знаю, как добавить некоторые данные в список. Могу ли я сделать это с помощью Mock или я должен сначала написать код для AddTransaction и использовать его в тестах баланса?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Вы должны проверить свой класс, используя только общедоступные «конечные точки», доступные для его потребителей.
В вашем случае это будет 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);

Второй тест

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);

Где реализация может быть

private decimal _balance;

public void AddTransaction(Transaction transaction)
{
    _balance += transaction.Amount;
}

public decimal Balance => _balance;

Как видите, класс можно реализовать без списка. Подход, описанный выше, может быть эффективен в случае, когда приложение использует Balance намного больше, чем AddTransaction метод.

Наличие тестов, которые не знают о реализации, может дать вам некоторую свободу для рефакторинга тестируемого класса без изменения тестов.

0 голосов
/ 06 мая 2018

Очевидно, что сначала вам нужно реализовать метод получения для Balance и метод AddTransaction. Теперь легко проверить баланс. Вы создаете одну или две транзакции с известными суммами в своем тестовом методе, вызываете AddTransactions, чтобы добавить их в учетную запись, а затем получаете значение Balance и сравниваете его с суммой всех сумм. Для тестирования добавить транзакцию, вам придется немного изменить класс своего аккаунта. Опции, которые я вижу:

  1. Добавить конструктор, который может принимать список транзакций (как уже упоминал Итан).
  2. Вас может беспокоить первый подход, поскольку он дает гораздо больший контроль над учетной записью. Если это так, то вы можете создать метод, чтобы получить количество транзакций в учетной записи и протестировать AddTransactions на основе этого.
  3. Создайте метод GetFirstTransaction и GetLastTransaction и проверьте его на основе метода AddTransaction.
  4. Это не стоит делать, но можно создать открытое свойство с помощью всего лишь метода получения, который возвращает глубокую копию списка транзакций, и вы можете проверить это в своем методе тестирования.
0 голосов
/ 06 мая 2018

Я могу подумать о трех возможных вариантах тестирования такого рода кода.

  1. Как вы упомянули, реализуйте код AddTransaction и используйте его в своих тестах для сравнения значения Balance.
  2. Вы можете сделать свойство транзакций общедоступным и смоделировать его в своих тестах.
  3. Измените класс Account, добавив конструктор, который позволит вам инициализировать Account с параметром транзакций, затем вы можете смоделировать транзакции и внедрить его в класс в тестах.
...