Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.23 KB | None | 0 0
  1.    //Что такое МОК?
  2.             //Мок это объект у которого тип и поведение определяется прямо в рантайме.
  3.            
  4.             //
  5.  
  6.             // Так мы создаем обычный мок без поведения. Он создает видимость что объект является IRepository<Project,int>, хотя на деле это лишь пустышка.
  7.             IRepository<Project,int> mockedProjectRepository = Mock.Of<IRepository<Project, int>>();
  8.  
  9.  
  10.             // Так мы создаем мок с поведением. Это будет проектный репозиторий. Причем если на нем вызвать метод Find и в качестве аргумента передать любую инстанцию GetProjectWith, то он вернет наш
  11.             // заранее определенный массив проектов. Еще раз - на самом деле это не репозиторий, а лишь пустышка, которая знает что ей нужно вернуть
  12.             var projects = new[]
  13.             {
  14.                 new Project()
  15.                 {
  16.                     Title = "Project "
  17.                 }
  18.             };
  19.            
  20.             IRepository<Project, int> mockedProjectRepository2 = Mock.Of<IRepository<Project, int>>
  21.                 (mock=>
  22.                     mock.Find(It.IsAny<GetProjectWith>()) == projects
  23.                 );
  24.  
  25.             // А вот так например, мы можем добавить еще и правило для вызова Get
  26.  
  27.             IRepository<Project, int> mockedProjectRepository3 = Mock.Of<IRepository<Project, int>>
  28.                 (mock =>
  29.                     mock.Find(It.IsAny<GetProjectWith>()) == projects &&
  30.                     mock.Get(It.IsAny<int>()) == new Project() // Вызов Get вернет новый проект
  31.                 );
  32.  
  33.            
  34.  
  35.             //Зачем нужны моки?
  36.             //Суть юнит-тестов в слове юнит - единица. Если у тебя в юнит тесте учавствует больше чем одна единица поведения, то это уже интеграционный тест.
  37.             //Классы которые не имеют поведения (например модели как Project) в счет не идут.
  38.  
  39.             //Зачем нужны моки в наших тестах?
  40.             //Каждый Экшн опирается на зависимости. Их можно легко вычислить, если перейти в класс и постреть пропы с атрибутом Include.
  41.             //Например класс CreateCategoryAction опирается на
  42.             // [Inject] public IRepository<Project, int?> ProjectRepository { private get; set; }
  43.             // [Inject] public IRepository<Category, int?> CategoriesRepository { private get; set; }
  44.             //
  45.             // Это значит что нам понадобится 2 мок-объекта.
  46.             // Как определить, какое поведение прикрутить к мокам?
  47.             // Это уже не так тривиально и зависит от того что мы тестируем.
  48.             //
  49.             // В этом тесте мы хотим протестировать то, что категория была создана и сохранена.
  50.             //
  51.             // Тоесть нам нужно
  52.             // А. Создать !инстанцию! CreateCategoryAction (ни в коем случае не мок - мы хотим тестировать реальный код, а не пустышку)
  53.             // B. Создать 2 мок-объекта для репозиториев Проекта и Категории
  54.             // С. У мок объектов нужно так определить поведение, чтобы в CreateCategoryAction все данные прошли валидацию
  55.             // D. Еще нам нужные побочные данные - Айди пользователя который вызывает Action (ExecutorID), а так же инстанция проекта, наполненая данными, которые важны для валидации
  56.             //      например у него в модераторах должен быть пользователь с ExecutorID
  57.             // E. Теперь нам нужно сделать тупо createCategoryAction.ProjectRepository = mockedProjectRepository и тоже самое для CategoryRepository
  58.             // F. Вызвать createCategoryAction.Execute(input) где инпут - это наши прямые входные данные
  59.             // G. Экшон вернет категорию, и нам нужно поставить Assert на правильность данных
  60.             // H. Наконец нужно проверить что Экшон вызвал метод Save на CategoryRepository
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement