Проблема с тестированием - PullRequest
0 голосов
/ 12 декабря 2011

Хорошо, у меня есть тестовый класс Nunit, который запускается через метод, позволяет ему все это CalcBalance (). В CalcBalance () у нас есть другой метод, который будет сохранять вещи в базе данных. Я не хочу иметь дело с базой данных при тестировании этого конкретного метода, но когда я запускаю свои тесты, метод базы данных выдает исключение и приводит к сбою теста, потому что базы данных не настроены / не проверены. Пример:

CalcBalance()
{

//Stuff I want to test

DatabaseInteraction()     //Throws exception

 return;         //This is the value I want to have tested.

}

У меня вопрос: есть ли способ настроить это так, чтобы тестер Nunit продолжал тестировать, даже если взаимодействие с базой данных говорит о сбое. Я закомментировал DatabaseInteraction () и запустил тест, и он прошел нормально.

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

Функциональность внутри DatabaseInteraction, которая вызывает исключение, должна быть абстрагирована к другому классу, который реализует интерфейс.Затем этот интерфейс можно смоделировать для использования в модульном тестировании.

Например:

public class BalanceCalculator
{
    readonly IDatabaseInteraction _databaseInteraction;

    public BalanceCalculator(IDatabaseInteraction databaseInteraction)
    {
        _databaseInteraction = databaseInteraction;
    }

    public Decimal CalcBalance()
    {
        //Stuff I want to test

        _databaseInteraction.Interaction();

        return 5.0D;         //This is the value I want to have tested.
    }
}

Затем в модульном тесте это можно сделать так (используя Moq):

[Test]
public void CheckValueTest()
{
    Mock<IDatabaseInteraction> mockInteraction = Mock<IDatabaseInteraction>();
    BalanceCalculator balanceCalculator = new BalanceCalculator(mockInteraction.Object);

    decimal result = balanceCalculator.CalcBalance();
    Assert.AreEqual(5.0D, result);
}

IDatabaseInteraction по идее ничего не делает, поэтому нет никаких шансов на исключение или какую-либо несвязанную функциональность.

Для получения дополнительной информации, прочитайте Инверсия управления, это действительно полезно для тестируемости.

0 голосов
/ 12 декабря 2011

Я бы согласился с @Sebastiaan Megens здесь. «Правильный» способ добиться этого -

a) Свободно связать взаимодействие вашей базы данных с помощью интерфейса, а затем просто создать фиктивную БД в тестовом коде или

b) Создайте свой код так, чтобы каждый объект мог функционировать как отдельная сущность.

При этом я полагаю, что вы можете настроить свой тест так, чтобы он ожидал исключения определенного типа, то есть он не завершится ошибкой, если такое исключение будет сгенерировано во время выполнения. Это далеко не идеал, но это цена, которую вы платите за тесно связанные архитектуры. Схожим образом, в вашем тесте просто оберните код, который вызывает MyObject.CalcBalance в попытку ... поймайте и продолжайте как обычно.

0 голосов
/ 12 декабря 2011

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

...