2016-10-31 14 views
1

私は、ASP.NET MVCプロジェクトのVisual Studio 2012 Ultimate with Entity Frameworkで作業しています。私は私のソリューションにユニットテストプロジェクトを含める必要があります。私の問題は、テストメソッド(Index())がコントローラーのIndex()アクションでセッション を認識できないという点です。私のユニットテスト方法は次のとおりです。ホームコントローラでユニットテストでセッションが認識されない

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Mvc; 
using ELSORegistry; 
using ELSORegistry.DataAccess; 
using ELSORegistry.Controllers; 



namespace ELSORegistryUnitTests 
{ 
    [TestClass] 
    public class FirstControllerTest 
    { 
     [TestMethod] 
     public void Index() 
     { 
      //Arange 
      HomeController controller = new HomeController(); 

      //Act 
      Guid? myGuid = new Guid("941b1615-f21b-4e2c-8fa8-0ed0d3f2de53"); 
      ViewResult result = controller.Index(myGuid) as ViewResult; 

      //Assert 
      Assert.IsNotNull(result); 
     } 
    } 
} 

マイ指数()アクションは次のとおりです。

using System; 
using System.Diagnostics.Contracts; 
using System.Web.Mvc; 
using ELSORegistry.DataAccess; 
using ELSORegistry.Models; 
using Kendo.Mvc.UI; 
using WebGrease.Css.Extensions; 
using ELSORegistry.Extensions; 



using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
using System.Data.Entity.Validation; 
using System.Linq; 
using Kendo.Mvc.Extensions; 
using System.Diagnostics; 
using ELSORegistry.Helpers; 
using Newtonsoft.Json; 


namespace ELSORegistry.Controllers 
{ 
    [Authorize] 
    public class HomeController : Controller 
    { 
     [Authorize(Roles = "ECLS Center Data Manager, ECLS Center Administrator,ECLS Center Data Viewer, ECLS Center Data Entry")] 
     //[RequireHttps] // Enable for production 
     public ActionResult Index(Guid? CenterId) 
     { 
      //---------------------------------------- 
      // Remove references to previous patients 
      //----------------------------------------  
      Session.Remove("Patient"); 
      Session.Remove("PatientSummary"); 
      Session.Remove("Run"); 
      Session.Remove("RunDetail"); 
      Session.Remove("Addendum"); 

      // if user have this session then he will get edit forms. // Yes if Add new 
      Session.Remove("AddNewMode"); 
      Session.Remove("AddNewRunId"); 
      Center center; 
      if (CenterId == null) 
      { 
       center = Session["Center"] as Center; 
       Contract.Assert(center != null); 
      } 
      else 
      { // set center by selected centerId from dropdownlist 
       center = new Repository().GetCenter(new Guid(CenterId.ToString())); 
       Session["Center"] = center; 
       center = Session["Center"] as Center; 
       Contract.Assert(center != null); 
      } 


      ViewBag.RunCounts = Session["RunCounts"]; 
      ViewBag.ChartSummaries = Session["ChartSummaries"]; 



      return View(new QuickAdd()); 

     } 

は、どのように私は自分のユニットテストメソッドからセッションを許可することができますか?助けをありがとうございました。

+2

セッションプロパティをモックするには、Moqのようなモックツールを使用する必要があります。 – CodeNotFound

+0

コントローラの依存関係もメソッド内でインスタンス化されています。 – Nkosi

答えて

2

手動で模擬セッションを作成するか、模擬フレームワークを使用してHTTPコンテキストの一部であるセッションを模擬するかのどちらかです。基本的には、実行時にフレームワークが何をするのかを再現しています。

[TestMethod] 
public void Index() { 
    //Arange 
    Guid? myGuid = new Guid("941b1615-f21b-4e2c-8fa8-0ed0d3f2de53"); 
    var center = new Center(); 
    var session = Mock.Of<HttpSessionStateBase>(); 
    session["Center"] = center; 
    var mockSession = Mock.Get(session); 
    mockSession.Setup(m => m["Center"]).Returns(center); 

    var httpcontext = Mock.Of<HttpContextBase>(); 
    var httpcontextSetup = Mock.Get(httpcontext); 
    httpcontextSetup.Setup(m => m.Session).Returns(session); 

    var mockRepository = new Mock<IRepository>(); 
    mockRepository.Setup(m => m.GetCenter(myGuid.Value)).Returns(center); 

    HomeController controller = new HomeController(mockRepository.Object); 
    controller.ControllerContext = new ControllerContext { 
     HttpContext = httpcontext, 
     Controller = controller 
    }; 

    //Act 
    ViewResult result = controller.Index(myGuid) as ViewResult; 

    //Assert 
    Assert.IsNotNull(result); 
} 

上記の例では、Moqを使用して依存関係を模倣しています。コントローラはまた、リポジトリを抽象化することにより、より良いテスト能力を可能にするようにリファクタリングされました。

public interface IRepository { 
    Center GetCenter(Guid guid); 
} 

public class Repository : IRepository { 
    //...other code removed for brevity 
} 

[Authorize] 
public class HomeController : Controller { 
    private IRepository repository; 

    public HomeController(IRepository repository) { 
     this.repository = repository; 
    } 

    [Authorize(Roles = "ECLS Center Data Manager, ECLS Center Administrator,ECLS Center Data Viewer, ECLS Center Data Entry")] 
    //[RequireHttps] // Enable for production 
    public ActionResult Index(Guid? CenterId) { 
     //---------------------------------------- 
     // Remove references to previous patients 
     //----------------------------------------  
     Session.Remove("Patient"); 
     Session.Remove("PatientSummary"); 
     Session.Remove("Run"); 
     Session.Remove("RunDetail"); 
     Session.Remove("Addendum"); 

     // if user have this session then he will get edit forms. // Yes if Add new 
     Session.Remove("AddNewMode"); 
     Session.Remove("AddNewRunId"); 
     Center center; 
     if (CenterId.GetValueOrDefault() == Guid.Empty) { 
      center = Session["Center"] as Center; 
      Contract.Assert(center != null); 
     } else { // set center by selected centerId from dropdownlist 
      center = repository.GetCenter(CenterId.Value); 
      Session["Center"] = center; 
      center = Session["Center"] as Center; 
      Contract.Assert(center != null); 
     } 

     ViewBag.RunCounts = Session["RunCounts"]; 
     ViewBag.ChartSummaries = Session["ChartSummaries"]; 

     return View(new QuickAdd()); 
    } 
} 
+0

ご関心とご協力ありがとうございます。 Mockにdllを含める方法をアドバイスしてください。 – alenan2013

+1

nugetを使ってプロジェクトをテストするために 'Moq'を追加してください。 – Nkosi

+0

ありがとうございました:) – alenan2013

関連する問題