powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Ioc и Unittest
25 сообщений из 32, страница 1 из 2
Ioc и Unittest
    #39848743
Junior1997
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня.Пытаюсь понять Ioc и не могу понять момент с Unit тестированием. Т.е в чём разница что метод упадёт при вызове у детали или у абстракции. Или плюс в том что мы можем тестировать метод любой реализации? Заранее благодарен
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39848781
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Junior1997,

у абстракции интересует факт самого вызова и данные, которые переданы
если абстракция возвращает данные, то тестируется правильная обработка полученных данных
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39848997
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Junior1997Всем доброго дня.Пытаюсь понять Ioc и не могу понять момент с Unit тестированием. Т.е в чём разница что метод упадёт при вызове у детали или у абстракции. Или плюс в том что мы можем тестировать метод любой реализации? Заранее благодарен

тестируешь ты всегда конкретную реализацию, конкретный код
интерфейсы тебе помогают в интересующий тебя класс подсунуть тестовую имплементацию. чтобы протестить изолированно от БД, http-вызовов, другого когда, которй что-то делает

Ioc тут вобщем-то не причем
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39848999
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttJunior1997,

у абстракции интересует факт самого вызова и данные, которые переданы
если абстракция возвращает данные, то тестируется правильная обработка полученных данных

Тестирвать интефейсы - оверхед
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39849001
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttJunior1997,

у абстракции интересует факт самого вызова и данные, которые переданы
если абстракция возвращает данные, то тестируется правильная обработка полученных данных

поясни
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39850269
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachТестирвать интефейсы - оверхед

Серьёзно?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class MySuperService
{
    private IMailSender mailSender;

    public MySuperService(IMailSender mailSender)
    {
       this.mailSender = mailSender;
    }

    public void DoSomething()
    {
       ...
       mailSender.Send(mail);
       ...
    }
}



Если мы покрываем тестами класс MySuperService, мы должны убедиться, что метод DoSomething вызовет метод Send у IMailService, и вызовет правильно. Если что-то возвращается из сервиса, то проверить, что данные правильно интерпретированы.

Какой ещё оверхед? Чего вы там городите? )))
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39850563
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttlove_bachТестирвать интефейсы - оверхед

Серьёзно?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class MySuperService
{
    private IMailSender mailSender;

    public MySuperService(IMailSender mailSender)
    {
       this.mailSender = mailSender;
    }

    public void DoSomething()
    {
       ...
       mailSender.Send(mail);
       ...
    }
}



Если мы покрываем тестами класс MySuperService, мы должны убедиться, что метод DoSomething вызовет метод Send у IMailService, и вызовет правильно. Если что-то возвращается из сервиса, то проверить, что данные правильно интерпретированы.

Какой ещё оверхед? Чего вы там городите? )))

Ok, не понял твой ответ сначала, а удалить сообщение уже нельзя
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39868775
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachТестирвать интефейсы - оверхед

WTF "тестировать интерфейсы"?
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39868825
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatlove_bachТестирвать интефейсы - оверхед

WTF "тестировать интерфейсы"?

Почему нет-то? Особенно с учётом, что у интерфейсов теперь появились дефолтные методы
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39868862
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПочему нет-то? Особенно с учётом, что у интерфейсов теперь появились дефолтные методы

По мне так от дефолтных методов каким-то злом попахивает.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39869120
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttПочему нет-то? Особенно с учётом, что у интерфейсов теперь появились дефолтные методы


По мне так от дефолтных методов каким-то злом попахивает.

да, теперь уже и не скажешь, что интерфейсы отличаются от классов наличием реализации у последних )))
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39870239
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachhVosttпропущено...


Серьёзно?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class MySuperService
{
    private IMailSender mailSender;

    public MySuperService(IMailSender mailSender)
    {
       this.mailSender = mailSender;
    }

    public void DoSomething()
    {
       ...
       mailSender.Send(mail);
       ...
    }
}



Если мы покрываем тестами класс MySuperService, мы должны убедиться, что метод DoSomething вызовет метод Send у IMailService, и вызовет правильно. Если что-то возвращается из сервиса, то проверить, что данные правильно интерпретированы.

Какой ещё оверхед? Чего вы там городите? )))

Ok, не понял твой ответ сначала, а удалить сообщение уже нельзя

ну, это конечно не называется "тестирование интерфейсов"
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39870298
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachну, это конечно не называется "тестирование интерфейсов"

интерфейсы это что?
это контракт.

тестирование правильного использования контракта в данном случае чем является?
тестирование интерфейса.

сам по себе интерфейс, конечно, не тестируется, а его конкретное использование в рамках тестирования конкретной реализации.

но. это ещё не всё.

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

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

и это ещё не всё.

сам интерфейс может быть протестирован как набор кейсов, покрывая все инварианты использования конкретного экземпляра интерфейса, независимых от реализации. это и есть тестирование интерфейса.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871296
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
к примеру, у вас на проекте может быть принято соглашение, например, для каждого сервисного интерфейса должен быть указан в атрибутах тип реализации, для автоматической регистрации зависимости.

Это что же получается то? Модули верхнего уровня зависят от модулей нижнего уровня, абстракции зависят от деталей. Вах-вах!
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871374
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttтестирование правильного использования контракта в данном случае чем является?
тестирование интерфейса.

тестирование правильного использования контракта это тестирование потребителя этого контракта.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871416
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВhVosttк примеру, у вас на проекте может быть принято соглашение, например, для каждого сервисного интерфейса должен быть указан в атрибутах тип реализации, для автоматической регистрации зависимости.

Это что же получается то? Модули верхнего уровня зависят от модулей нижнего уровня, абстракции зависят от деталей. Вах-вах!

в каком месте-то? )

fkthatтестирование правильного использования контракта это тестирование потребителя этого контракта.

код теста имитирует потребителя.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871813
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttкод теста имитирует потребителя.

Ты чота путаешь.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var readerMock = new Mock<IReader>();
var writerMock = new Mock<IWriter>();

readerMock.Setup(m => m.ReadData()).Returns(testData);

var testee = new ObjectUnderTheTest(readerMock.Object, writeMock.Object);
testee.ReadAndWrite();

writerMock.Verify(m => m.WriteData(testData));



Человеческим языком это можно было бы озвучить так: "При условии, что реализация "IReader.ReadData" вернет данные "testData", метод "ObjectUnderTheTest.ReadAndWrite" должен вызвать метод "IWriter.WriteData" с этими данными." Где тут имитация? Тестируется именно concrete method ReadAndWrite класса ObjectUnderTheTest.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871838
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЧеловеческим языком это можно было бы озвучить так: "При условии, что реализация "IReader.ReadData" вернет данные "testData", метод "ObjectUnderTheTest.ReadAndWrite" должен вызвать метод "IWriter.WriteData" с этими данными." Где тут имитация? Тестируется именно concrete method ReadAndWrite класса ObjectUnderTheTest.

контракты тоже можно тестировать :)
на предмет полноты и достижимости.
плюс, гарантия, что контракт не изменится, а если изменится, то как это повлияет на сценарии использования.

например:

Код: c#
1.
2.
3.
public ICalc {
  void Sum(int a);
}




тест

Код: c#
1.
2.
var mock = new Mock<ICalc>();
var sum = mock.Object.Sum(2, 3);




интересует декларативное выполнение контракта, а не реализация.
виден сценарий использования контракта.

:)
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871871
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
2.
var mock = new Mock<ICalc>();
var sum = mock.Object.Sum(2, 3);




Ну и "Sum" вернет просто "0". В чем тут тест-то? В том что у "ICalc" просто есть метод "Sum" с двумя параметрами, что ли? Так это и так ясно, если код собирается - не адов JS все-таки.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871875
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Была, впрочем, в докоревские времена такая фреймворка, как "Microsoft Code Contracts" (R.I.P.) и она действительно позволяла описать контракты интерфейса отдельно от его реализации и даже протестировать их не имея реализации вообще.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871997
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVostt,

Была, впрочем, в докоревские времена такая фреймворка, как "Microsoft Code Contracts" (R.I.P.) и она действительно позволяла описать контракты интерфейса отдельно от его реализации и даже протестировать их не имея реализации вообще.

хвост так-то правильно говорит, но считает, что его термины/стиль общения общеупотребимы. "тестирование интерфейсов" - да все уже поняли, о чем тут
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39871999
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttтестирование правильного использования контракта в данном случае чем является?
тестирование интерфейса.

тестирование правильного использования контракта это тестирование потребителя этого контракта.

да, но вроде про это и речь?
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39872000
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttlove_bachну, это конечно не называется "тестирование интерфейсов"

интерфейсы это что?
это контракт.

тестирование правильного использования контракта в данном случае чем является?
тестирование интерфейса.

сам по себе интерфейс, конечно, не тестируется, а его конкретное использование в рамках тестирования конкретной реализации.

но. это ещё не всё.

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

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

и это ещё не всё.

сам интерфейс может быть протестирован как набор кейсов, покрывая все инварианты использования конкретного экземпляра интерфейса, независимых от реализации. это и есть тестирование интерфейса.

местами ты загоняешься:
"например, для каждого сервисного интерфейса должен быть указан в атрибутах тип реализации, для автоматической регистрации зависимости" - хер ты это протестишь, похожий топик а Java есть

"для каждого сервисного интерфейса должен быть указан в атрибутах тип реализации, для автоматической регистрации зависимости"
тут какой-то проеб в архитектуре

"единственный способ гарантировать, что никто не забыл указать атрибут, это протестировать все интерфейсы на предмет наличия правильных атрибутов. без всякой реализации"
как, рефлексией?
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39872021
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachhVosttк примеру, у вас на проекте может быть принято соглашение, например, для каждого сервисного интерфейса должен быть указан в атрибутах тип реализации, для автоматической регистрации зависимости

Ну, тут он чота вообще прогнал. Интерфейс вообще не должен нихера знать про свои реализации и все, конец сказке. Кстати, как они с таким соглашением будут выкручиваться, если у них интерфейс и реализация в разных сборках. А если захочется выпилить вообще нах текущюю реализацию и сделать новую, то придется лезть в интерфейс и менять аттрибут. Регистрация "by conventions" это очень даже упортребляемая вещь, но делается она совсем не так, да и вообще все норм. контейнеры её и так из коробки поддерживают, без всяких половых фантазий с аттрибутами.

Код: c#
1.
2.
3.
builder.RegisterAssemblyTypes(myServicesAssembly)
    .Where(t => t.Name.EndsWith("Service))
    .AsImplementedInterfaces();


Вообще, на мой вкус и цвет любая сборка с интерфейсами, классами и т.п. должна быть "container-agnostic", т.е. вообще ничего не знать про то, что её будут через IoC дергать, не говоря уже о том, чтобы как-то зависеть от конкретного контейнера.
...
Рейтинг: 0 / 0
Ioc и Unittest
    #39872024
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttсам интерфейс может быть протестирован как набор кейсов, покрывая все инварианты использования конкретного экземпляра интерфейса, независимых от реализации. это и есть тестирование интерфейса.

"Посмотри, что за х...ню ты написал" (с) Ты, вроде бы, умный человек, но периодически начинаешь впадать в какую-то ересь. Соблюдение инвариантов и постусловий - это ответственность кнкретной реализации контракта - без неё ты никак это не протестируешь. Можно, в принципе, протестировать, что потребитель сервиса всегда соблюдает предусловия, но это опять-таки будет тест кода потребителя сервиса, а не кода интерфейса.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[Fact]
public void WeCallTheService_ShouldNeverCallServiceWithNegativeArg()
{
    var serviceMiock = new Mock<IService>();
    var testee = new ServiceClient(serviceMock.Object);
    testee.WeCallTheService();

    serviceMock.Verify(m => m.WeDontAcceptNegatives(
        It.Is<Int>(x => x < 0), Times.Never
    ));
}
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Ioc и Unittest
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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