0

SitecoreContext dépendance Je suis un développeur de Sitecore, et je veux créer un projet de test unitaire d'hélice Sitecore échantillon pour tester la méthode d'action exacte ci-dessous Index() de notre « HomeBottomContentController "contrôleur, sans aucune injection de dépendance dans un constructeur. Notez que le code commenté est exactement ce que je ne veux PAS faire.Comment Unité de test d'une action GlassController sans injection

public class HomeBottomContentController : GlassController 
{ 
    // I want to test the EXACT method below 
    public override ActionResult Index() 
    { 
     var context = new SitecoreContext(); 
     var model = context.GetCurrentItem<Home_Control>(); 
     return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model); 
    } 

    /* 
    // I do NOT want to have any of the below code for injecting ISitecoreContext into a constructor and testing the IndexTest() below it. 
    private readonly ISitecoreContext _iSitecoreContext; 
    public HomeBottomContentController(ISitecoreContext iSitecoreContext) 
    { 
     _iSitecoreContext = iSitecoreContext; 
    } 

    public HomeBottomContentController() 
    { } 

    public ActionResult IndexTest() 
    { 
     var model = _iSitecoreContext.GetCurrentItem<Home_Control>(); 
     return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model); 
    } 
    */ 
} 

Voici ce que j'ai dans ma classe de tests unitaires. Encore une fois, ce que je l'ai commenté exactement ce que je ne veux faire: Méthode

[TestClass] 
public class MvcUnitTests 
{ 
    [TestMethod] 
    public void Test_HomeBottomContentController_With_ISitecoreContext() 
    { 
     /* 
     // I don't want to do below... 
     var model = new Home_Control() 
     { Bottom_Content = "XYZ" }; 

     var iSitecoreContext = new Mock<Glass.Mapper.Sc.ISitecoreContext>(); 
     iSitecoreContext.Setup(_ => _.GetCurrentItem<Home_Control>(false, false)).Returns(model); 

     HomeBottomContentController controllerUnderTest = new HomeBottomContentController(iSitecoreContext.Object); 

     var result = controllerUnderTest.IndexTest() as ViewResult; 
     */ 

     //I want to test using the exact constructor below and calling that exact Index() method. 
     HomeBottomContentController controllerUnderTest = new HomeBottomContentController(); 
     var result = controllerUnderTest.Index() as ViewResult; 
     Assert.IsNotNull(result); 
     Assert.IsNotNull(result.Model); 
     //Assert.AreEqual(((Home_Control)result.Model).Bottom_Content, "XYZ"); 
    } 
} 

Comment puis-je tester Index exacte de mon contrôleur() sans avoir à ajouter du code à la classe HomeBottomContentController qui permet l'injection de dépendance dans un constructeur (comme le code commenté ci-dessus)? Je ne veux pas avoir à ajouter du code à HomeBottomContentController().

@Aleksey Shevchenko Si j'essaie votre solution, comment puis-je connecter le modèle à iSitecoreContext, puis l'assigner à controllerUnderTest.FakeContext? Mon code ci-dessous lance erreur de compilation (Vous ne pouvez pas convertir Mock de Glass.Mapper.Sc.ISitecoreContext à Glass.Mapper.Sc.ISitecoreContext, comment accomplissons-nous que):

var model = new Home_Control() 
{ Top_Content = "Some Dummy Test Home Top Content" }; 
var iSitecoreContext = new Mock<Glass.Mapper.Sc.ISitecoreContext>(); 
//var iSitecoreContext = new Glass.Mapper.Sc.SitecoreContext();  
iSitecoreContext.Setup(_ => _.GetCurrentItem<Home_Control>(false, false)).Returns(model); 
FakeHomeTopContentController controllerUnderTest = new FakeHomeTopContentController(); 
controllerUnderTest.FakeContext = (Glass.Mapper.Sc.SitecoreContext)iSitecoreContext; 

Répondre

2

Si vous ne voulez pas créer une injection de dépendance via le constructeur, vous pouvez le faire via une méthode virtuelle protégée. Quelque chose comme ça:

public class HomeBottomContentController : GlassController 
{ 
    public override ActionResult Index() 
    { 
     var context = this.GetContext(); 
     var model = context.GetCurrentItem<Home_Control>(); 
     return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model); 
    } 

    protected virtual SitecoreContext GetContext() 
    { 
     return new SitecoreContext(); 
    } 
} 

[TestClass] 
public class MvcUnitTests 
{ 
    [TestMethod] 
    public void Test_HomeBottomContentController_With_ISitecoreContext() 
    {  
     var controllerUnderTest = new FakeHomeBottomContentController(); 
     controllerUnderTest.FakeContext = /* set what you want */; 
     var result = controllerUnderTest.Index() as ViewResult; 
     Assert.IsNotNull(result); 
     Assert.IsNotNull(result.Model);   
    } 

    public class FakeHomeBottomContentController : HomeBottomContentController 
    { 
     public SitecoreContext FakeContext { get; set; } 

     protected override SitecoreContext GetContext() 
     { 
      return this.FakeContext; 
     } 
    } 
} 
+0

merci! Voici ce que j'ai, ce qui donne et l'erreur, comment puis-je brancher le modèle à l'iSitecoreContext et définir que le FakeContext ?: var model = new Home_Control() {Top_Content = "Certains Test Accueil Dummy Top Content" } var iSitecoreContext = nouvelle maquette (); iSitecoreContext.Setup (_ => _.GetCurrentItem (false, false)). Returns (model); FakeHomeTopContentController controllerUnderTest = new FakeHomeTopContentController(); controllerUnderTest.FakeContext = (Glass.Mapper.Sc.SitecoreContext) iSitecoreContext; – user3034243

+0

@ user3034243 Essayez de modifier la dernière ligne à cette vue: controllerUnderTest.FakeContext = (Glass.Mapper.Sc.SitecoreContext) (iSitecoreContext.Object); –

0

Je ne connais pas les limites de votre capacité à mettre fin au code source, mais en fonction de votre commentaire à l'autre réponse que vous avez accès. J'opterais pour DI de Poor Man, avoir deux constructeurs sur le contrôleur. Le test unitaire utilise le second constructeur et MVC utilisera le constructeur sans paramètre.

public class HomeBottomContentController : GlassController 
{ 

ISitecoreContext _iSitecoreContext; 

public HomeBottomContentController() :this(new SitecoreContext()){ 
} 


public HomeBottomContentController(ISitecoreContext iSitecoreContext) 
{ 
    _iSitecoreContext = iSitecoreContext; 
} 



public ActionResult IndexTest() 
{ 
    var model = _iSitecoreContext.GetCurrentItem<Home_Control>(); 
    return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model); 
} 

} 

[TestClass] 
public class MvcUnitTests 
{ 
[TestMethod] 
public void Test_HomeBottomContentController_With_ISitecoreContext() 
{ 

    var model = new Home_Control() 
    { Bottom_Content = "XYZ" }; 

    var iSitecoreContext = new Mock<Glass.Mapper.Sc.ISitecoreContext>(); 
    iSitecoreContext.Setup(_ => _.GetCurrentItem<Home_Control>(false, false)).Returns(model); 

    HomeBottomContentController controllerUnderTest = new HomeBottomContentController(iSitecoreContext.Object); 

    var result = controllerUnderTest.IndexTest() as ViewResult; 

}