Во-первых, определенно сложнее получить такой уровень охвата интеграционными тестами, поэтому я думаю, что юнит-тесты все еще превосходят.Тем не менее, я думаю, у вас есть точка.Трудно синхронизировать поведение ваших объектов.
Ответ на этот вопрос заключается в том, чтобы провести частичные интеграционные тесты, в которых реальные сервисы имеют глубину 1 уровень, но помимо этого имитируют.Например:
var sut = new SubjectUnderTest(new Service1(Mock.Of<Service1A>(), ...), ...);
Это решает проблему синхронизации поведения, но усугубляет уровень сложности, потому что теперь вам нужно настроить гораздо больше насмешек.
Вы можете решить эту проблему вфункциональный язык программирования, использующий различимые союзы.Например:
// discriminated union
type ResponseType
| Success
| Fail of string // takes an argument of type string
// a function
let saveObject x =
if x = "" then
Fail "argument was empty"
else
// do something
Success
let result = saveObject arg
// handle response types
match result with
| Success -> printf "success"
| Fail msg -> printf "Failure: %s" msg
Вы определяете дискриминируемое объединение с именем ResponseType
, которое имеет ряд возможных состояний, некоторые из которых могут принимать аргументы и другие метаданные.Каждый раз, когда вы получаете доступ к возвращаемому значению, вам приходится сталкиваться с различными условиями.Если бы вы добавили другой тип ошибки или тип успеха, компилятор будет предупреждать вас каждый раз, когда вы не обрабатываете новый элемент.
Эта концепция может иметь большое значение для обработки эволюции программы.,C #, Java, Ruby и другие языки используют исключения для сообщения об ошибках.Но эти условия отказа часто вовсе не являются «исключительными» обстоятельствами, что в итоге приводит к ситуации, с которой вы сталкиваетесь.
Я думаю, что функциональные языки наиболее близки к тому, чтобы дать лучший ответ на ваш вопрос.Честно говоря, я не думаю, что есть идеальный ответ или даже хороший ответ на многих языках.Но проверка во время компиляции может иметь большое значение