2017-02-16 87 views
0

如何在ASP.net核心單元測試項目中模擬會話變量?如何在ASP.net核心單元測試項目中模擬會話變量?

1)我創建了一個會話的模擬對象。

Mock mockHttpContext = new Mock(); Mock mockHttpContext = new Mock(); Mock mockSession = new Mock()。As();

2)設置getString()方法

mockSession.Setup(S => s.GetString( 「的moduleId」))返回( 「1」)。

3)創建controllerContext和分配mockhttpContext對象

controller.ControllerContext.HttpContext = mockHttpContext.Object;

4)試圖從控制器讀取。

HttpContext.Session.GetString( 「的moduleId」)

而我得到 「的moduleId」 的空值。請幫我嘲笑會議getString()方法

例子:

 //Arrange 
     //Note: Mock session 
     Mock<HttpContext> mockHttpContext = new Mock<HttpContext>(); 
     Mock<ITestSession> mockSession = new Mock<ISession>().As<ITestSession>(); 
     //Cast list to IEnumerable 
     IEnumerable<string> sessionKeys = new string[] { }; 
     //Convert to list. 
     List<string> listSessionKeys = sessionKeys.ToList(); 
     listSessionKeys.Add("ModuleId"); 
     sessionKeys = listSessionKeys; 
     mockSession.Setup(s => s.Keys).Returns(sessionKeys); 
     mockSession.Setup(s => s.Id).Returns("89eca97a-872a-4ba2-06fe-ba715c3f32be"); 
     mockSession.Setup(s => s.IsAvailable).Returns(true); 
     mockHttpContext.Setup(s => s.Session).Returns(mockSession.Object); 
    mockSession.Setup(s => s.GetString("ModuleId")).Returns("1");   

     //Mock TempData 
     var tempDataMock = new Mock<ITempDataDictionary>(); 
     //tempDataMock.Setup(s => s.Peek("ModuleId")).Returns("1"); 

     //Mock service 
     Mock<ITempServices> mockITempServices= new Mock<ITempServices>(); 
     mockITempServices.Setup(m => m.PostWebApiData(url)).Returns(Task.FromResult(response)); 

     //Mock Management class method 
     Mock<ITestManagement> mockITestManagement = new Mock<ITestManagement>(); 
     mockITestManagement .Setup(s => s.SetFollowUnfollow(url)).Returns(Task.FromResult(response)); 

     //Call Controller method 
     TestController controller = new TestController (mockITestManagement .Object, appSettings); 
     controller.ControllerContext.HttpContext = mockHttpContext.Object;    
     controller.TempData = tempDataMock.Object; 

     //Act 
     string response = await controller.Follow("true"); 

     // Assert 
     Assert.NotNull(response); 
     Assert.IsType<string>(response); 
+0

顯示待測試的方法。 – Nkosi

+0

謝謝NKosi的回覆。 –

+0

我得到了解決這個問題的方法。我在會話的模擬類上創建並從ISession繼承。在這個模擬類中實現了所有的ISession方法,並使用這個類來存儲會話變量。 –

回答

0

首先創建類命名mockHttpSession和繼承的Isession。

公共類MockHttpSession:的Isession { 字典的sessionStorage =新詞典();

public object this[string name] 
    { 
     get { return sessionStorage[name]; } 
     set { sessionStorage[name] = value; } 
    } 

    string ISession.Id 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    bool ISession.IsAvailable 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    IEnumerable<string> ISession.Keys 
    { 
     get { return sessionStorage.Keys; } 
    } 

    void ISession.Clear() 
    { 
     sessionStorage.Clear(); 
    } 

    Task ISession.CommitAsync() 
    { 
     throw new NotImplementedException(); 
    } 

    Task ISession.LoadAsync() 
    { 
     throw new NotImplementedException(); 
    } 

    void ISession.Remove(string key) 
    { 
     sessionStorage.Remove(key); 
    } 

    void ISession.Set(string key, byte[] value) 
    { 
     sessionStorage[key] = value; 
    } 

    bool ISession.TryGetValue(string key, out byte[] value) 
    { 
     if (sessionStorage[key] != null) 
     { 
      value = Encoding.ASCII.GetBytes(sessionStorage[key].ToString()); 
      return true; 
     } 
     else 
     { 
      value = null; 
      return false; 
     } 
    }   
**}** 

然後在實際控制人使用這個會話:

 Mock<HttpContext> mockHttpContext = new Mock<HttpContext>(); 
     MockHttpSession mockSession = new MockHttpSession();   
     mockSession["Key"] = Value; 
     mockHttpContext.Setup(s => s.Session).Returns(mockSession); 
     Controller controller=new Controller(); 
     controller.ControllerContext.HttpContext = mockHttpContext.Object; 
+0

我們可以使用這個會話類來存儲會話變量。例如:首先創建mockHttpSession的對象,然後存儲變量值。 –

0

我只是碰到了這個問題,最近進出的唯一方式是嘲笑的GetString方法包裝,這是TryGetValue功能。

byte[] dummy = System.Text.Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()); 
_mockSession.Setup(x => x.TryGetValue(It.IsAny<string>(),out dummy)).Returns(true).Verifiable(); 

因此,您不需要模擬對GetString方法的調用,只需模擬調用幕後的方法即可。

相關問題