2015-03-26 1 views
1

Ok, j'ai essayé. mais je ne peux pas envelopper ma tête autour de cela.Comment tester l'unité Contrôleur MVC Action qui appelle un service associé au contrôleur

J'ai un contrôleur

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 est une propriété publique de type service intérieur de la classe abstraite ExtController qui à son tour étend la classe contrôleur

/// <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 
} 

et est ici la Code de test unitaire utilisant 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 il est problème lorsque la méthode Create est appelée il doit utiliser Svc pour traiter l'opération, donc je suppose que je dois Mock ça! mais je ne peux pas comprendre comment.

devrais-je me moquer du contrôleur! mais je ne peux pas parce que c'est une classe scellée! ou l'ExtController! Je suis perdu et j'ai besoin de conseils.

[FWIW] Ce projet est basé sur Xenta MVC Framework (Open Source) qui a cette architecture Aperçu Xenta Architecture Overview

Répondre

0

Vous ne devriez pas se moquer du contrôleur parce que c'est ce que vous essayez de tester. Comme vous l'avez dit, vous devez simuler la propriété Svc. Une solution possible consiste à rendre la propriété redéfinissable dans votre résumé ExtController puis à l'ignorer dans CourseController. Vous pouvez maintenant définir votre propriété Svc sur un test dans le test unitaire.