Форум программистов, компьютерный форум CyberForum.ru

Как проверять и тестировать входные аргументы конструктора? - C++

Восстановить пароль Регистрация
 
R_e_n
0 / 0 / 0
Регистрация: 30.07.2012
Сообщений: 35
24.04.2014, 15:48     Как проверять и тестировать входные аргументы конструктора? #1
Подскажите, пожалуйста, как проверять и тестировать входные аргументы конструктора?

Пусть есть некоторый класс. И в конструкторе один входной аргумент - строка. Я делаю так:
в конструкторе проверяю, если строка не корректная, я кидаю исключение std::invalid_argument("").

Когда я тестирую я создаю штук 15 объектов, которым передаю в конструкторе разные строки. Если какая-то
строка некорректная, я отлавливаю исключение и проверяю должно ли оно было появиться на этой строке или нет.

Но у меня такое чувство, что нормальные люди так не делают.

Набросал примерный код.
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <stdexcept>
#include <assert.h>
 
 
class SomeClass {
public:
    SomeClass(const std::string &line) {
        if (line[0] != 'a') {
            // ok
        }
        else
        {
            throw std::invalid_argument("The First character is 'a'! ");
        }
    }
};
 
 
class SomeClassTest {
public:
    void ConstructorTest() {
        bool hasErrorBeen = false;
        try
        {
            SomeClass object1("Hello");
        }
        catch(std::invalid_argument& error)
        {
            hasErrorBeen = true;
        }
        assert(hasErrorBeen == false);
 
        hasErrorBeen = false;
        try
        {
            SomeClass object2("aHello");
        }
        catch(std::invalid_argument& error)
        {
            hasErrorBeen = true;
        }
        assert(hasErrorBeen == true);
 
        // И тут еще 15 таких тестов
    }
};
 
int main() {
 
    SomeClassTest someClassTest;
    someClassTest.ConstructorTest();
 
    return 0;
}


http://ideone.com/cK0b9b
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2014, 15:48     Как проверять и тестировать входные аргументы конструктора?
Посмотрите здесь:

C++ Как передавать аргументы консольному приложению в Debug?
Как создать 3 конструктора? C++
итераты как аргументы в фунции C++
с++ командная строка, Вывести все нечисловые аргументы, но выводит все аргументы чего-то, C++
C++ как добавить запятую в аргументы макроса?
C++ Аргументы шаблонного метода как объекты
C++ Разработать класс-контейнер. Как тестировать?
Как сделать, чтобы компилятор ругался на аргументы? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
24.04.2014, 16:27     Как проверять и тестировать входные аргументы конструктора? #2
Почему бы не запихать все в один try-catch?
C++
1
2
3
4
5
6
7
8
9
10
11
try
{
   SomeClass c1("cool"), c2("0"), c3("qwerty") /*...*/;
   //SomeClass c[15] = {};
}
catch(std::invalid_argument e)
{
   std::cout << "Error occured in the constructor of some of the 15 objects" << endl;
   std::cin.get();
   exit(true);
}
А вообще кидать исключения из конструктора не запрещено, а даже иногда необходимо, т.к. конструктор не может вернуть код ошибки и кроме как выкинуть исключение путей нет. Деструкторы будут вызваны для сформировавшихся объектов при выбрасывании исключения. Ну и как вариант, что бы не кидать исключения, можно выводить ошибку прямо в конструкторе объекта, если что то пошло не так, и сразу exit().
Yandex
Объявления
24.04.2014, 16:27     Как проверять и тестировать входные аргументы конструктора?
Ответ Создать тему
Опции темы

Текущее время: 08:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru