Я не знаком с C #, поэтому не могу помочь вам с ложным вопросом, полагаю, это зависит от вашей среды тестирования.
Я делаю много TDD, и в целом мой подход - это подход сверху вниз. Сначала я думаю просто о коде, который хочу написать, чтобы что-то сделать. Допустим, в вашем примере у меня есть класс Client и я хочу сделать что-то вроде: Client.initiate_reviews
Поэтому я пишу тест, который устанавливает контекст (пара клиентов, некоторые с отзывами). Затем вызовите Client.initiate_reviews, а затем запишите все утверждения, чтобы определить, выполнил ли он свою работу, то есть для подмножества клиентов, которые должны были быть проверены, выполняется ли сейчас проверка и отправлены ли все ожидаемые результаты?
В зависимости от количества побочных эффектов, которые имеет метод, может быть целесообразно разделить его на несколько тестов.
Затем я захожу в клиентский класс, определяю метод и думаю о коде, который я хотел бы написать в нем. Может быть так:
clients = Client.find_all_due_for_review
for_each client in clients {
review = Review.start_new_for(client)
Letter.send_for_review(review)
}
Затем я бы написал тесты для методов, вызываемых в этом методе, которые я должен реализовать. Find_all_due_for_review не имеет побочных эффектов, но возвращает что-то, поэтому, конечно, вы можете проверить возвращаемое значение здесь и, возможно, ничего не изменилось.
И повторять до тех пор, пока не пройдёт первый тест.
Таким образом, каждый аспект проверяется должным образом, и вы даже получаете некоторые методы, которые вы можете использовать повторно.
Надеюсь, это поможет!