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