Moq и конкретные зависимости в ASP.NET MVC 2 - PullRequest
0 голосов
/ 20 ноября 2010

Я работаю над проектом ASP.NET MVC 2. Мне вручили несколько классов контроллеров с жесткой зависимостью от класса хранилища данных, что-то вроде этого:

public class MyController : Controller
{
  MyRepository myRepository = new MyRepository();
  // ...
}

Класс MyRepository - это бетон, а не интерфейс.

По сути, хотя у меня есть доступ для чтения к этому коду, у меня нет прав на запись. Я пытаюсь написать несколько модульных тестов, чтобы убедиться, что это работает. Само собой разумеется, что я не хочу, чтобы действительная база данных попала в этот момент, поэтому ясно, что есть какое-то издевательство.

Я довольно новичок в модульном тестировании и макете, но я прочитал о Moq и думаю, что у меня есть общее представление о том, как это работает. Мне удалось успешно создать простой объект-репозиторий, но проблема в том, что я до сих пор не знаю, как передать его в класс!

Если бы я написал оригинальный код, я бы использовал интерфейс, а не конкретный класс, и я бы написал дополнительный конструктор для внедрения зависимостей. На самом деле я в беспорядке.

Может ли Moq помочь мне передать его в класс (если я высмеиваю MyController), или мне нужно ходатайствовать о доступе на запись, чтобы я мог провести рефакторинг?

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010

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

1 голос
/ 20 ноября 2010

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

Если вы не можете изменить код, вы всегда можете изменить что-то, используя личное отражение. Но делать это хрупко, потому что изменение в реализации контроллеров может нарушить ваши тесты.

Конечно, тогда вам нужно выяснить, как издеваться над хранилищем. Если бы он не был предназначен для насмешек, то что-то вроде Родинок могло бы работать

...