Модульный тест и сессия? - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть что-то вроде этого:

public bool IsValidEmployee(string email, string password)
{
  bool valid = false;
  var employee = dataAccess.GetEmployee(email, password);

  if(employee! = null)
   {
      valid = true;
      HttpContext.Current.Session["Employee"] = employee;
   }

   return valid;
}

Мой юнит-тест:

[TestMethod()]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("C:\Projects", "/")]
[UrlToTest("http://localhost:59349/")]
public void GetEmployeeTest()
{
   Domain target = new Domain();        

   var mockHttpContext = new Mock<HttpContextBase>();
   mockHttpContext.SetupSet(c => c.Session["Employee"] = It.IsAny<object>());

   Assert.IsTrue(target.IsValidEmployee("sam@gmail.com", "test");                
 }

Код не работает как

Нулевая ссылка на объект 'HttpContext.Current.Session ["Employee"] = employee;'

Любые предложения, как я могу исправить эту ошибку?

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Я не верю, что простого макетирования HttpSession достаточно, чтобы заставить сеанс в вашем методе принять смоделированное поведение.Вам нужен способ внедрить эту зависимость.

Вы можете изменить дизайн своей функции так, чтобы она воспринимала объект сеанса как параметр.Это сделало бы ваш метод тестируемым

Например

public bool IsValidEmployee(string email, string password, HttpSessionStateBase session)
{
  bool valid = false;
  var employee = dataAccess.GetEmployee(email, password);

  if(employee! = null)
   {
      valid = true;
      session["Employee"] = employee;
   }

   return valid;
}

Кроме того, вы могли бы создать "SessionManager", который мог бы подразумевать ISessionManager, который обернул бы весь ваш доступ к состоянию сеанса и обошел бы его, делая егоеще более поддается проверке, таким образом, отделяя ответственность за то, как и где сохранять состояние сеанса, от проверки работника.

1 голос
/ 02 декабря 2011

Кроты позволят вам перехватывать и заменять звонки на сеанс.

http://research.microsoft.com/en-us/projects/pex/getstarted.pdf

Следует избегать использования сессии, если это вообще возможно, из-за нагрузки, которую она возлагает на сервер.

Этот код выглядит довольно подверженным ошибкам, но, возможно, именно поэтому вы добавляете модульные тесты.

0 голосов
/ 03 декабря 2011

Какой код не работает? Это тестовый сбой из-за ошибки в вашем методе, или это происходит в самом тестовом коде?

Независимо от того, как вы могли бы улучшить свой тест (и это может показаться немного очевидным), но мне интересно, установили ли вы точку останова в строке установки в своем методе тестирования и действительно проверили, что объект Вы пытаетесь присвоить значение NULL? Если это так, вам нужно проверить свои настройки, и, как другие, возможно, сказали, вам, вероятно, нужно будет смоделировать сеанс таким образом, чтобы гарантировать, что часть настройки вашего теста не провалится.

Приветствие.

0 голосов
/ 02 декабря 2011

Я думаю, вам также нужно издеваться над геттером для сессии ...

public void GetEmployeeTest()
    {
        Domain target = new Domain();
        var mockHttpContext = new Mock<HttpContextBase>();
        var mockSession = new Mock<HttpSessionStateBase>();
        mockHttpContext.SetupGet(c => c.Session).Returns(mockSession.Object);
        mockHttpContext.SetupSet(c => c.Session["Employee"] = It.IsAny<object>());
        Assert.IsTrue(target.IsValidEmployee("sam@gmail.com", "test"));
    }
...