0

私はsitecoreの開発者で、私たちの "HomeBottomContentController"のIndex()アクションメソッドの下で、正確にをテストするサンプルのsitecoreヘリックスユニットテストプロジェクトを作成したい"コントローラ、依存性注入なしでコンストラクタに。コメントアウトされたコードはまさに私がやりたくないものです。SitecoreContext依存性注入を使わないでGlassControllerアクションをテストする方法

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); 
    } 
    */ 
} 

ここで私のユニットテストクラスには何がありますか?

[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"); 
    } 
} 

どのように私は依存性の注入を可能にHomeBottomContentControllerクラスにコードを追加することなく、私のコントローラの正確な指数()メソッドをテストすることができます。繰り返しますが、私は私がやりたくないんまさに何をコメントアウトしています上記のコメントアウトされたコードのようなコンストラクタに移動しますか? HomeBottomContentController()にコードを追加する必要はありません。

@Aleksey Shevchenko私があなたのソリューションを試してみたら、モデルをiSitecoreContextに正確に接続し、それをcontrollerUnderTest.FakeContextに割り当てるにはどうすればいいですか?あなたがしたくない場合は

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; 

答えて

2

:私のコードは以下のコンパイルエラーがスローされます(あなたがGlass.Mapper.Sc.ISitecoreContextにGlass.Mapper.Sc.ISitecoreContextのモックから変換することはできません、どのように我々はそれを達成ん)コンストラクタを介して依存関係注入を作成すると、保護された仮想メソッドを通じてそのことを行うことができます。そのような何か:

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

ありがとうございました!ここで私が与えるとエラーこれ、持っているものですが、どのように私はiSitecoreContext にモデルをフックアップして設定できるようFakeContext?: VARモデル=新しいHome_Control() {Top_Content =「いくつかのダミーのテストホームトップコンテンツ」として}; var iSitecoreContext = new Mock (); iSitecoreContext.Setup(_ => _.GetCurrentItem (false、false))。(モデル)を返します。 FakeHomeTopContentController controllerUnderTest =新しいFakeHomeTopContentController(); controllerUnderTest.FakeContext =(Glass.Mapper.Sc.SitecoreContext)iSitecoreContext; – user3034243

+0

@ user3034243最後の行を次のように変更してください。 controllerUnderTest.FakeContext =(Glass.Mapper.Sc.SitecoreContext)(iSitecoreContext.Object); –

0

私は、ソースコードを終了するにはあなたの能力の限界を知りませんが、他の答えにあなたのコメントをもとに、あなたはそれにアクセスすることができます。私はPoor ManのDIを選択し、コントローラーに2つのコンストラクターを持っています。単体テストは2番目のコンストラクタを使用し、MVCはパラメータのないコンストラクタを使用します。

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; 

} 
関連する問題