2015-03-26 2 views
1

Хорошо, я попробовал. но я не могу обернуть голову вокруг этого.Как протестировать контроллер MVC Действие, вызывающее службу, связанную с контроллером

У меня есть контроллер,

public sealed class CourseController : ExtController 
{ 
[HttpPost, PersistState, InRole("")] //TODO [SECURITY] [FIX] UPDATE SECURITY ROLES ] 

    public ActionResult Create(string[] flags, string name, string code, string description) 
    { 
     try 
     { 
      var Course = Svc.ProcessOperation("CreateCourse", new 
      { 

       Flags = flags.Merge(",") 
      }); 



      Svc.ProcessOperation("CreateCourseTranslation", new 
      { 
       CourseId = Course.EntityID, 
       LanguageId = JAs.Int32(Svc.Localization.Language.EntityID), 
       Name = name, 
       Description = description, 
       Code = code 

      }); 
      TempData.PersistStatus("Success"); 

      return View(); 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddModelError("API", ex); 
      TempData.PersistStatus("Failed"); 
     } 
     return RedirectToAction("Create"); 
    } 
} 

Svc является публичной собственностью типа Service внутри ExtController абстрактный класс, который в свою очередь, расширяет класс контроллера

/// <summary> 
/// Represents the exteded controller. 
/// </summary> 
public abstract class ExtController : Controller 
{ 
    #region Properties 

    /// <summary> 
    /// Gets the service associated with the controller. 
    /// </summary> 
    public Service Svc 
    { 
     get 
     { 
      return HttpContext.Svc(); 
     } 
    } 

    #endregion 
} 

и вот Код испытания устройства с использованием NUnit

[Test] 
    public void Create_HttpPost_Action_Returns_Create_View() 
    { 
     // Arrange   
     var customersController = new CourseController(); 

     // Act 
     var result = customersController.Create(new[] { "None" }, "courseName", "Code", "description") as ViewResult; 

     // Assert 
     Assert.IsNotNull(result, "Should have returned a ViewResult"); 
     result.AssertViewRendered().ForView("Create"); 

    } 

T он Проблема заключается в том, когда Создать метод называется он должен использовать SVC для обработки операции, поэтому я предполагаю, что я должен Mock этого! но я не могу понять, как это сделать.

Должен ли я высмеивать контроллер! но я не могу, потому что это запечатанный класс! или ExtController! Я потерян и нуждаюсь в руководстве.

[FWIW] Этот проект основан на Xenta MVC Framework (Open Source), который имеет этот Архитектура Обзор Xenta Architecture Overview

ответ

0

Вы не должны издеваться контроллер, потому что это то, что вы пытаетесь проверить. Как вы сказали, вы должны высмеять имущество Svc. Одно из возможных решений заключается в том, чтобы сделать свойство переопределяемым в вашем абстрактном ExtController, а затем переопределить его в . Теперь вы можете настроить свойство Svc на макет в модульном тесте.

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