Проблемы с имитацией IUnityContainer при тестировании UnityControllerFactory в проекте MVC - PullRequest
0 голосов
/ 26 ноября 2010

У меня проблемы с тестированием фабрики контроллеров единства. Я вынимаю контейнер для единицы и утверждаю, что для него был вызван метод. Я получаю неправильное ожидание приведения, но не могу понять, что не так с моим кодом.

Вот тестируемый класс:

public class UnityControllerFactory : IControllerFactory
    {
        private readonly IUnityContainer _container;

        public UnityControllerFactory(IUnityContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            _container = container;
        }

        public IController CreateController(RequestContext requestContext, string controllerName)
        {
            return _container.Resolve<IController>(controllerName);
        }

        public void ReleaseController(IController controller)
        {
            _container.Teardown(controller);
        }        
    }

и вот тест:

[Test]
        public void CreateControllerCallsResolveOnContainerWithCorrectArgument()
        {
            const string controllerName = "WhateverController";

            var containerMock = MockRepository.GenerateMock<IUnityContainer>();

            var controllerFactory = new UnityControllerFactory(containerMock);

            controllerFactory.CreateController(null, controllerName);

            containerMock.AssertWasCalled(x => x.Resolve<IController>(controllerName));
        }

и вот сообщение об ошибке:

System.InvalidCastException: невозможно преобразовать объект типа 'ObjectProxy42336d85f7bb400f9590892348d1d597' в тип 'System.Web.Mvc.IController'

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Общий метод Resolve<T>(string) является методом расширения и не может быть смоделирован. У вас есть два варианта здесь:

  1. Используйте неуниверсальный метод Resolve(Type, string) или
  2. Оберните IUnityContainer своим собственным интерфейсом, чтобы общие методы, которые вы хотите использовать, были методами интерфейса, а не методами расширения.
0 голосов
/ 26 ноября 2010

Почему бы вам просто не использовать реальную реализацию IUnityContainer и не зарегистрировать в ней макеты / заглушки?

...