Проблема

  • Сложность
  • Ложное чувство безопасности.
  • Параллельные/парные объекты (реальные и имитации) могут привести к проблемам с ремонтопригодностью.
  • Ремонтопригодность

Решение

  • Издевайтесь только над некоммерческими организациями.
  • Удалите макет, если его интерфейс имеет слишком много поведения.

Образец кода

Неправильный

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.