2014-02-04 2 views
1

Я вызываю метод контроллера, который создает объект и сохраняет его в сеансе. Однако, когда я пытаюсь проверить значение возвращаемого сеанса, я не могу понять, как его утверждать?Проверка возвращенной сессии с помощью Moq

Ill предоставить свой код здесь:

Метод испытания

[TestMethod] 
    public void StartTest() 
    { 
     // Arrange 
     ControllerSetup(); 

     var setup = new Setup { IsCustomMaxGuess = false, MaxGuesses = 3, IsTimed = true }; 
     this._mockSession.SetupGet(s => s["session"]).Returns(null);    
     this._mockControllerContext.Setup(p => p.HttpContext.Session).Returns(this._mockSession.Object); 
     this._sut.ControllerContext = this._mockControllerContext.Object; 

     // Act 
     var result = _sut.Start(setup) as ViewResult; 

     // Assert 
     if (result != null) 
      //Verify somehow here? 
    } 

метод Контроллер GET

[HttpGet] 
    public ActionResult Start(Setup gameSetup) 
    { 
     ViewBag.Title = "Secret Number - The Game"; 

     SecretNumber sn; 

     if (Session["session"] == null) 
     { 
      sn = new SecretNumber(gameSetup); 
      Session.Add("session", sn); 

      return View("GameView", Session["session"]); 
     } 
     sn = (SecretNumber)(Session["session"]); 
     sn.Initialize(); 

     return View("GameView", sn); 
    } 

Так коротко описал это пойдет в Условный оператор в сессии имеет значение null и создает объект. И последнее, но не менее важное: он вернет сеанс с представлением. Я хочу проверить, что он хранит объект secretnumber. Как?

С уважением

ответ

2

Этот метод не может быть протестирована в изоляции, как вы не издеваться объект Session.

Если вы использовали тестовую первую разработку (TDD) вместе с "Dependency Inversion Principle" (т. Е. «Зависимость от абстракций. Не зависит от конкреций».), Вы бы не столкнулись с этой проблемой.

Прежде всего вам необходимо определить интерфейс для SessionManager, который будет управлять взаимодействием с объектом Session, например.

public class ISessionManager 
{ 
public SecretNumber GetSecretNumber(); 
public void SetSecretNumber(SecretNumber sn); 
} 

Теперь вы реорганизовать класс настройки так, чтобы Вы вводите эту зависимость (читай на «Dependency Injection»), например,

public class Setup 
{ 
public bool IsCustomMaxGuess; 
public int MaxGuesses; 
public bool IsTimed; 

private ISessionManager; 

public Setup(ISessionManager sessionManager) 
{ 
    this.sessionManager = sessionManager; 
} 
} 

Следующая реорганизовать метод Start, чтобы использовать эту зависимость:

[HttpGet] 
public ActionResult Start(Setup gameSetup) 
{ 
    ViewBag.Title = "Secret Number - The Game"; 

    var secretNumber = this.sessionManager.GetSecretNumber(); 

    if (secretNumber == null) 
    { 
     sn = new SecretNumber(gameSetup); 
     this.sessionManager.SetSecretNumber(secretNumber); 

     return View("GameView", secretNumber); 
    } 

    secretNumber.Initialize(); 

    return View("GameView", secretNumber); 
} 

Наконец с этим все сделано, то вы будете иметь возможность издеваться поведение зависимости sessionManager, которая позволит вам, чтобы завершить тест, например

this._mockSessionManager.GetSession(s => GetSecretNumber()).Returns(null); 

И проверить, что сеанс был установлен в «если» заявление:

this._mockSessionManager.Verify(s => SetSecretNumber(It.IsAny<SecretNumber>()); 

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

Обратите внимание, что я не скомпилировал ни один из этого кода, чтобы он мог быть немного грубым по краям!

+0

Спасибо за отличный ответ. Я попробую это, но то, что мне не нравится, это то, что я собираюсь закончить код только для тестирования внутри класса Setup. например public Setup (ISessionManager sessionManager) и т. д. Как-то не кажется законным, что-то говорит мне, что это неправильно ... – Rovdjuret

+2

Как я уже сказал в своем ответе, в вашем методе вы кодировали конкреции, а не абстракции. По мере того, как вы это сделали, вы не сможете тестировать эти методы без использования ваших зависимостей. То, что я предложил, является учебным подходом, и это не «неправильно делать»! –

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