2017-02-16 2 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.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 в этом классе mock и использовали этот класс для хранения переменных сеанса. –

ответ

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, вы просто издеваются, что метод, который требует за кулисами.

Смежные вопросы