Простейший, самый быстрый способ разбить все зависимости от класса

При работе с устаревшим кодом и попытке создания тестов я часто выхожу из зависимостей от классов или методов, поэтому я могу писать модульные тесты с использованием mocks для этих зависимостей. Зависимости чаще всего встречаются в виде вызовов статических классов и объектов, созданных с использованием нового ключевого слова в конструкторе или других местах в этом классе.

В большинстве случаев статические вызовы обрабатываются либо путем обертывания статической зависимости, либо если его одноэлементный шаблон (или аналогичный) в форме StaticClass.Current.MethodCall() передают эту зависимость по своему интерфейсу, вместо этого создайте конструктор.

В большинстве случаев использование нового ключевого слова в конструкторе просто заменяется передачей этого интерфейса в конструкторе.

В большинстве случаев использование нового ключевого слова в других частях класса обрабатывается либо тем же способом, как описано выше, либо при необходимости создает factory и передает интерфейс factory в конструкторе.

Я всегда использую инструменты рефакторинга Resharpers, чтобы помочь мне во всех этих случаях, однако большинство вещей по-прежнему являются ручным трудом (который может быть автоматизирован), а также для некоторых унаследованных классов и методов, которые могут быть очень утомительным процессом. Существуют ли какие-либо другие плагины рефакторинга и/или инструменты, которые помогут мне в этом процессе? Есть ли способ "рефакторинга" с одним словом "разбить все инструменты от этого класса"? =)

Мне кажется, что все эти шаги являются общими для многих разработчиков и общей проблемой, и прежде чем я попытаюсь написать плагин для Resharper или CodeRush, я должен спросить, потому что кто-то, вероятно, уже пытался это сделать.

ДОБАВЛЕНО:

В отражении ответов ниже: даже если вы не захотите вырывать все сразу (одно нажатие всего одного щелчка может вызвать больше проблем, чем помогает), все еще имея возможность просто вырваться из 1 зависимости методов или 1-2 зависимостей легко, будет иметь большую разницу.

Кроме того, код рефакторинга имеет меру "попробуйте и посмотрите, что происходит, только чтобы узнать, как все сочетается", и общий разрыв одного щелчка поможет этому процессу, даже если вы не проверите этот код...

Ответ 1

Я не думаю, что есть инструмент, который может автоматизировать это для вас. Работа с устаревшим кодом означает, что вы меняете код с небольшими шагами за раз. Эти шаги часто преднамеренно невелики, чтобы предотвратить ошибки. Обычно первое изменение, которое вы должны сделать, это тот, который делает этот код пригодным для тестирования. После того, как вы написали тест, вы измените эту часть кода таким образом, чтобы исправить ошибку или реализовать RFC.

Поскольку вы должны предпринимать небольшие шаги, я считаю, что трудно использовать инструмент рефакторинга, чтобы волшебным образом устранить все ваши зависимости. С устаревшими системами вы вряд ли когда-либо захотите совершить большие изменения сразу, потому что риск взлома (а не выяснения из-за отсутствия тестов) слишком велик. Это, однако, не означает, что инструменты рефакторинга могут использоваться в этом сценарии. Напротив; они очень помогают.

Если вы еще этого не сделали, я бы посоветовал вам прочитать книгу Майкла Перса Эффективно работать с устаревшим кодом. Он описывает в деталях ряд шаблонов, которые помогут вам реорганизовать устаревший код на более тестируемую систему.

Удачи.

Ответ 2

Когда дело доходит до статических зависимостей вызова, вы можете проверить Moles. Он способен выполнять инъекцию кода во время выполнения, чтобы заглушить любой вызов статического или не виртуального метода с помощью собственной тестовой реализации. Это удобно для тестирования устаревшего кода, который не был разработан с использованием тестовых интерфейсов, инъецированных с помощью зависимостей.