Как добиться внедрения зависимости от классов ViewModel? - PullRequest
2 голосов
/ 13 июня 2011

У меня есть класс модели представления, в котором есть метод, который выполняет вычисления на основе периода времени между датой в модели представления и текущим временем с использованием DateTime.Now.

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

Кто-нибудь знает, как этого можно достичь? Я использую Mvc3 с StructureMap.

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

Я не буду делать такие расчеты на модели представления. На модели представления я бы придерживался свойств POCO. Я выполнил бы этот расчет в тот момент, когда я сопоставляю свою модель предметной области с моделью представления. Это можно сделать либо в действии контроллера, либо на уровне отображения, где у вас есть доступ к уровню обслуживания.

0 голосов
/ 13 июня 2011

Вместо написания метода в viewmodel для проверки DOB, вы можете написать собственный валидатор DOB, например:

public static ValidationResult DOBValidator(DateTime DOB)
    {
        if (DOB!= null && DOB.Date != DateTime.MinValue.Date)
        {
            int age = DateTime.Now.Year - DOB.Year;
            if (age < 18)
            {
                return new ValidationResult("Sorry, age should be more than 18 years");
            }
        }

        return ValidationResult.Success;
    }
}

затем вы можете украсить свой объект DOB в viewmodel чем-то вроде:

[CustomValidation(typeof(ViewModelClassName), "DOBValidator")]

и в своем модульном тесте вы можете просто вызвать метод viewmodel и передать фиктивное значение datetime:

DateTime testDOB = DateTime.Now.AddYears(-18);
        ValidationResult result = ViewModelObject.DOBValidator(testDOB);
        Assert.AreEqual(ValidationResult.Success, result, "The ValidationResult was incorrect");

Надеюсь, это поможет.

...