Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Послать по ссылке статический член класса в метод этого же класса? / 14 сообщений из 14, страница 1 из 1
17.08.2014, 22:56
    #38722067
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Метод класса вызывается достаточно много раз и должен работать с одним экземпляром некого объекта. Этот объект я держу как статический в классе метода.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
class A
{
    public static MyObject myObject;
    
    private void MyMethod() 
    {
        // Работаем с myObject...
    }
}



Всё хорошо, но вот проблема - хочу сделать юнит-тест для этого метода. При этом хочу этот объект, который статический член, с которым работает метод, подменить во время теста. Но, поскольку метод работает со статическим членом, то этот член всегда достаупен этому методу.

Хотел вот спросить - ничего криминального нет в том, чтобы послать этот статический объект методу в виде параметра? - Ну, чисто для надобности удобства тестирования.

Или такие случаи как-то более лучше воркэраундятся?
...
Рейтинг: 0 / 0
17.08.2014, 23:17
    #38722080
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
НемоКэп42Или такие случаи как-то более лучше воркэраундятся?

удалением статического члена,
заменой на DI (передача параметром в конструктор - один из вариантов)
...
Рейтинг: 0 / 0
18.08.2014, 05:52
    #38722145
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
ИзопропилНемоКэп42Или такие случаи как-то более лучше воркэраундятся?

удалением статического члена,
заменой на DI (передача параметром в конструктор - один из вариантов)
А это решение - чисто для удобства тестирования, или вообще лучше, даже без учёта тестов?

А то мне иногда кажется глупым менять где-то удобную и понятную структуру программы в угоду удобству тестирования. Как будто тесты главнее кода и композиции программы.
...
Рейтинг: 0 / 0
18.08.2014, 06:20
    #38722148
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class MyTest
{
    public void MyTestMethod()
    {
        A.myObject = new MyObjectTestImpl();        
        new A().MyMethod();
    }
}


?
...
Рейтинг: 0 / 0
18.08.2014, 06:58
    #38722151
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Алексей К
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class MyTest
{
    public void MyTestMethod()
    {
        A.myObject = new MyObjectTestImpl();        
        new A().MyMethod();
    }
}


?
Во, неплохо уже. )))

А вот теперь такая штука. Метод-то у меня закрытый. Но я уже не раз встречал утверждение - если класс дошёл до закрытых методов, то надо вытаскивать их в другой класс и делать эти методы открытыми.

Это что, тестирование ломает всю парадигму ООП и диктует свои условия? Или это только в test driven development такая байда? Для меня это откровение, что надо отказываться от закрытых методов в угоду тестированию.

Ещё такое утверждение есть: для всех закрытых методов должны быть открытые обёртки - для тестирования.

Что выбрать, как быть?
...
Рейтинг: 0 / 0
18.08.2014, 07:18
    #38722154
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
А ещё есть такой костылик, как PrivateObject.

От обилия опций кругом идёт голова...
...
Рейтинг: 0 / 0
18.08.2014, 07:19
    #38722155
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Во, нашёл правильный ответ! http://stackoverflow.com/a/18043812/808128
...
Рейтинг: 0 / 0
18.08.2014, 07:46
    #38722157
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Алексей К
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
class MyTest
{
    public void MyTestMethod()
    {
        A.myObject = new MyObjectTestImpl();        
        new A().MyMethod();
    }
}


?
Нет, плохо - тестеру нужно знать, что нужно инициализировать статический член.

Пока всё же остановился на передаче статического члена параметров в метод - хоть и очень костыльный вариант, но наиболее компромиссный.
...
Рейтинг: 0 / 0
18.08.2014, 07:47
    #38722158
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
НемоКэп42Что выбрать, как быть? 16453234

?
...
Рейтинг: 0 / 0
18.08.2014, 09:21
    #38722188
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
НемоКэп42А это решение - чисто для удобства тестирования, или вообще лучше, даже без учёта тестов?
на все случаи
...
Рейтинг: 0 / 0
18.08.2014, 20:04
    #38722927
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Всё же, быть статическим членом для myObject как раз подходит по смыслу программы. А вводить DI - это надо в другой класс ответственность за хранение myObject выносить.

Сделал так: убрал MyMethod в отдельный хелперный класс (тоже по смыслу подходит), в классе А передаю в метод MyMethod статический объект myObject как параметр. В юнит-тесте создаю отдально этот объект, но уже не как статический.

Так я угождаю всем. Единственное, что смущает, это передача стики как параметра. Ну и что? - Потому что могу!
...
Рейтинг: 0 / 0
18.08.2014, 20:05
    #38722928
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
НемоКэп42Единственное, что смущает, это передача стики статики как параметра. Ну и что? - Потому что могу!
...
Рейтинг: 0 / 0
18.08.2014, 22:12
    #38722999
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
НемоКэп42А вводить DI - это надо в другой класс ответственность за хранение myObject выносить.
DI контейнер с этим великолепно справляется. И не только с хранением, но и с инстанцированием.
При необходимости - за временем жизни может проследить


НемоКэп42Так я угождаю всем
есть 1001 способ выстрелить себе в ногу
...
Рейтинг: 0 / 0
19.08.2014, 17:47
    #38723727
НемоКэп42
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Послать по ссылке статический член класса в метод этого же класса?
Ну, я пока не вижу проблемы в этом. Работает же. Как будут проблемы - будут решать.

В принципе, мне подход с DI понятен - я даже могу, при желании подыскать для myObject класс, чтобы он о нём заботился. Но мне лень переделывать некритичный участок кода, который и так работает.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Послать по ссылке статический член класса в метод этого же класса? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]