передача mocked-параметра в mocked-интерфейс - PullRequest
5 голосов
/ 01 декабря 2011

Я использую nuit с moq для проверки своих контроллеров.

Я использую класс сеанса, который имеет интерфейс, и HttpContext внедряется в конструктор с помощью ninject. как это

      public class SessionService : ISession
        {
            public HttpContext Context { get; set; }

            public SessionService(HttpContext context)
            {
                this.Context = context;
            }
    }


       public interface ISession
        {
            HttpContext Context { get; set; }
    }



   public HomeController(ISession session)
        {
            _session = session;

        }

Я думаю, чтобы протестировать контроллер, я сначала смоделировал HttpContext, а затем передал этот объект создателю смоделированной сессии ISession. У меня есть это до сих пор

 [Test]
 public void index_returns_view()
        {
             //arrange
            var mockHttpContext = new Mock<HttpContext>();
            var mockContext = new Mock<ISession>(mockHttpContext);
            var c = new HomeController(mockContext.Object);
            //act
            var v = c.Index() as ViewResult;
            //assert
            Assert.AreEqual(v.ViewName, "Index", "Index View name incorrect");
         }

, который строит, но nunit возвращает следующую ошибку при запуске теста

System.NotSupportedException: тип для имитации должен быть интерфейсом или абстрактным или незапечатанным классом.

Спасибо за помощь.

1 Ответ

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

Пусть ваша сессия использует HttpContextBase в конструкторе и использует его в качестве типа свойства.Вы все еще должны быть в состоянии передать конкретный HttpContext сеансу в производственном коде.

  public class SessionService : ISession 
    { 
        public HttpContextBase Context { get; set; } 

        public SessionService(HttpContextBase context) 
        { 
            this.Context = context; 
        } 
} 

Затем исправьте свой модульный тест, передав «mockHttpContext.Object» конструктору сеанса и что он высмеивает HttpContextBase.

 [Test]    
 public void index_returns_view()    
        {    
             //arrange    
            var mockHttpContext = new Mock<HttpContextBase>();    
            var mockContext = new Mock<ISession>(mockHttpContext.Object);    
            var c = new HomeController(mockContext.Object);    
            //act    
            var v = c.Index() as ViewResult;    
            //assert    
            Assert.AreEqual(v.ViewName, "Index", "Index View name incorrect");    
         } 
...