Я пытаюсь выяснить лучшие практики написания тестового кода, но более конкретно методы, связанные с построением объектов. В синей книге мы обнаружили, что мы должны применять инварианты при создании объектов, чтобы избежать искажения наших сущностей, объектов ценности и т.д. С учетом этой мысли, 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 предлагает, чтобы мы не злоупотребляли нулевыми чеками в коде (что противоречит дизайну по контракту) из-за этого, писать тесты становится болью, в качестве альтернативы он советует лучше писать больше тестов, чем "просто что наш код безопасен только потому, что у нас есть нулевые проверки везде"
Что вы думаете об этом? Как бы вы это сделали? Какая должна быть лучшая практика?