Модульное тестирование атрибутов валидации MVC 2 с использованием IoC - PullRequest
1 голос
/ 01 сентября 2010

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

Основная часть кода теста такова:

[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. Как лучше всего обойти эту проблему: найти способ каким-то образом смоделировать атрибут валидации или есть ли способ, которым Виндзор может внедрить поддельное хранилище при запуске модульного теста? Любая помощь / совет будет высоко ценится.

1 Ответ

1 голос
/ 02 сентября 2010

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

...