1

В настоящее время я пишу некоторые модульные тесты для контроллера ASP.NET MVC 2 и имею некоторые проблемы с атрибутами проверки MVC 2.0. В рассматриваемом атрибуте проверки используется репозиторий, чтобы проверить, нет ли повторяющихся имен в текущем источнике данных, и я хотел бы заменить этот репозиторий фальшивым во время моего модульного теста. Я использую Castle Windsor, согласно this article, что позволяет мне заменить хранилище во время выполнения, но я не уверен, как это сделать во время модульного теста.MVC 2 Проверка атрибута с помощью IoC

Основная часть тестового кода заключается в следующем:

[TestMethod] 
    public void TestSaveDuplicateTitleNameReturnsValidationErrorView() 
    { 
     //Arrange 
     var titleRepository = new FakeTitleRepository(); 
     var controller = new TitleController(titleRepository);    

     var selectedTitle = new Title(); 
     selectedTitle.Name = "Fru"; 

     //Act 
     var actual = controller.Save(selectedTitle); 

пример кода из контроллера ниже:

public ActionResult Save(Title SelectedTitle) 
    { 
     if (TryValidateModel(SelectedTitle)) 
     { 
      TitleRepository.Add(SelectedTitle); 
      TitleRepository.Save(); 

Хранилище используется в самом контроллере во время теста моя подделка тот, который я прошел, но когда запускается TryValidateModel и выполняется следующий код, он вызывает исключение, поскольку репозиторий имеет значение null:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
public class ValidTitleNameAttribute : ValidationAttribute 
{ 
    public ITitleRepository Repository { get; set; } 

    public override bool IsValid(object value) 
    { 
     bool isValid = true; 

     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
     object name = properties.Find("Name", true).GetValue(value); 

     if (name == null) 
     { 
      return isValid = false; 
     } 

     var titles = Repository.GetAllTitles(); 

Очевидно, что в свойстве хранилища я мог бы установить экземпляр по умолчанию для ссылки на конкретный репозиторий, который предотвратил бы исключение во время тестирования, но это победит цель использования контейнера IoC. Каким был бы лучший способ обойти эту проблему, было бы найти способ издеваться над атрибутом проверки каким-либо образом или есть способ, которым Windsor может вводить поддельный репозиторий, когда выполняется единичный тест? Любая помощь/совет будут высоко оценены.

+0

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

ответ

1

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

Смежные вопросы