Я пытаюсь выяснить лучшие практики написания тестового кода, но более конкретно методы, связанные с построением объектов. В синей книге мы обнаружили, что мы должны применять инварианты при создании объектов, чтобы избежать искажения наших сущностей, объектов ценности и т.д. С учетом этой мысли, Design By Contract кажется решением, чтобы избежать повреждения наших объектов, но когда мы следуем этому, мы могли бы написать код следующим образом:
class Car
{
//Constructor
public Car(Door door, Engine engine, Wheel wheel)
{
Contract.Requires(door).IsNotNull("Door is required");
Contract.Requires(engine).IsNotNull("Engine is required");
Contract.Requires(wheel).IsNotNull("Wheel is required");
....
}
...
public void StartEngine()
{
this.engine.Start();
}
}
Хорошо, это хорошо выглядит на первый взгляд? Кажется, мы строим безопасный класс, который раскрывает контракт, поэтому каждый раз, когда создается объект Car
, мы можем точно знать, что объект "действителен".
Теперь рассмотрим этот пример с точки зрения тестирования.
Я хочу создать тестовый код, но для того, чтобы изолировать мой объект Car
, мне нужно создать либо макет заглушки, либо фиктивный объект для каждой зависимости только для создания моего объекта, даже если возможно, я просто хочу протестировать метод, который использует только одну из этих зависимостей, например метод StartEngine
. Следуя философии тестирования Misko Hevery, я бы хотел написать свой тест, явно указав, что мне не нужны объекты Door или Wheel, просто передающие нулевую ссылку на конструктор, но поскольку я проверяю нули, я просто не могу этого сделать
Это всего лишь небольшая часть кода, но когда вы сталкиваетесь с реальным тестированием приложений, становится все труднее и труднее, потому что вам нужно разрешать зависимости для вашего объекта
Misko предлагает, чтобы мы не злоупотребляли нулевыми чеками в коде (что противоречит дизайну по контракту) из-за этого, писать тесты становится болью, в качестве альтернативы он советует лучше писать больше тестов, чем "просто что наш код безопасен только потому, что у нас есть нулевые проверки везде"
Что вы думаете об этом? Как бы вы это сделали? Какая должна быть лучшая практика?