Проблема
- Сложность
- Ложное чувство безопасности.
- Параллельные/парные объекты (реальные и имитации) могут привести к проблемам с ремонтопригодностью.
- Ремонтопригодность
Решение
- Издевайтесь только над некоммерческими организациями.
- Удалите макет, если его интерфейс имеет слишком много поведения.
Образец кода
Неправильный
class PaymentTest { @Test fun `process payment should return true on successful payment`() { val paymentDetails = mapOf( "amount" to "100", "currency" to "USD", "cardNumber" to "1234567890123456", "expiryDate" to "12/20", "cvv" to "123" ) // We should not mock a business object val payment = mockk<Payment>() every { payment.process(any(), any()) } returns true // This is an external and coupled system. // We have no control on it so tests might be fragile val authorizeNet = AuthorizeNetAIM(Payment.API_ID, Payment.TRANSACTION_KEY) val result = payment.process(authorizeNet, paymentDetails) assertTrue(result) } }
Верно
class PaymentTest { @Test fun `process payment should return true on successful payment`() { val paymentDetails = mapOf( "amount" to "100", "currency" to "USD", "cardNumber" to "1234567890123456", "expiryDate" to "12/20", "cvv" to "123" ) val payment = Payment() // External system is mocked val response = Response(approved = true, transactionId = "1234567890") val authorizeNet = mockk<AuthorizeNetAIM>() every { authorizeNet.authorizeAndCapture() } returns response val result = payment.process(authorizeNet, paymentDetails) assertTrue(result) } }
Исключения
- Имитация случайных проблем (сериализация, базы данных, API) — очень хорошая привычка, чтобы избежать связанности.
Заключение
Макеты, как и другие тестовые двойники, являются ценными инструментами. Разумное их использование — это искусство.
Представьте себе спектакль, в котором каждый актер вместо репетиций с другими актерами должен был взаимодействовать с 25 сценаристами. Актеры никогда не репетировали вместе. Каков будет результат игры?
Надеюсь, вам понравилось это путешествие и вы узнали что-то новое. Если вы хотите быть в курсе моих последних мыслей и идей, не стесняйтесь подписаться на мою информационную рассылку. Вы также можете найти меня в LinkedIn или Twitter. Оставайтесь на связи и продолжайте общение!
Кредиты
Первоначально опубликовано на https://yonatankarp.com.