Макет об'єкта: відмінності між версіями

[перевірена версія][очікує на перевірку]
Вилучено вміст Додано вміст
Виправлено джерел: 3; позначено як недійсні: 0. #IABot (v2.0beta15)
Немає опису редагування
Рядок 35:
Використання макетних об'єктів може прив'язати юніт-тести до фактичної реалізації коду, який проходить випробування. Наприклад, фреймворків для юніт-тестування дозволяють розробнику перевіряти, скільки разів і у якому порядку тестований об'єкт викликає макетний об'єкт; рефакторинг може змінити порядок таких викликів, і, при тому що фактично код залишатиметься робочим, тест буде не пройдено. Такі тести називають крихкими. Це доводить, що макетний об'єкт має імітувати лише зовнішню поведінку справжнього, і не прив'язуватися до деталей внутрішньої реалізації.
 
== Реалізація ==
 
Нехай, наша аплікація містить операції із конвертуванням грошей. У ній присутній наступний сервіс.
 
{{sxhl|lang=csharp|1=
public interface ICurrencyExchange
{
Task<Money> Convert(Money originalAmount, Currency destinationCurrency);
}
}}
 
Щоб перевірити роботу логіки, яке залежить на цьому сервісі створимо імітацію необхідної нам поведінки.
 
{{sxhl|lang=csharp|1=
var mock = new Mock<ICurrencyExchange>();
mock
.Setup(x => x.Convert(It.IsAny<Money>(), It.Is<Currency>(c => c == Currency.Euro)))
.ReturnsAsync(new Money(10, Currency.Euro));
 
ICurrencyExchange currencyExchange = mock.Object;
}}
 
== Зв'язок з іншими патернами ==
 
* '''Макет об'єкта''' та '''заглушка сервісу''' часто плутають. Та варто розуміти, що '''макет об'єкта''' використовуються для імітації поведінки однієї чи декількох функцій та залежно від умов ця імітація може відрізнятись в той час, як '''заглушка сервісу''' замінює цілий сервіс та його реалізація залишається незмінною.
 
== Дивіться також ==
* [[Заглушка сервісу (шаблон проєктування)]]
 
{{Шаблони проєктування ПЗ}}
 
{{ВП-портали|Програмування}}