Как я могу использовать Ninject в моих тестах ASP MVC MSpec? - PullRequest
0 голосов
/ 16 января 2012

Я пытаюсь написать тест MSpec, который создает один из моих контроллеров со всеми правильными привязками Ninject. Как мне это сделать? Это то, что я до сих пор:

    [Subject(Concern.Initialization)]
public class when_permanent_employee_page_is_loaded_for_first_time
{
    private static PermanentEmployeeController controller;

    Establish context = () =>
        {
            NinjectControllerFactory controllerFactory = new NinjectControllerFactory();
            ControllerBuilder.Current.SetControllerFactory(controllerFactory);
            controller = (PermanentEmployeeController)controllerFactory.CreateController(new RequestContext(), "PermanentEmployee");
        };

    private Because of = () => controller.Index();

    private It should_load_all_available_jobs = () =>
        { 
            var blah = controller;
            var blah3 = 3;
        };
    It should_load_all_available_locations;
    It should_load_all_available_departments;
}

В приведенном выше коде я просто пытаюсь понять, смогу ли я создать экземпляр своего контроллера со всеми тактовыми привязками Ninject. Класс NinjectControllerFactory выглядит следующим образом:

public class NinjectControllerFactory : DefaultControllerFactory
{
    private IKernel kernel = new StandardKernel(new DefaultModule());

    public IKernel Kernel 
    { 
        get
        {
            return kernel;
        }
        set
        {
            this.kernel = value;
        }
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            return null;
        }

        return (IController)kernel.Get(controllerType);
    }
}

И класс DefaultModule, как это:

public class DefaultModule : NinjectModule
{
    /// <summary>
    /// Performs the binding of interfaces to their respective implementations. 'Tis very cool.
    /// </summary>
    public override void Load()
    {
        // Data service bindings
        Bind<IJobService>().To<JobServiceImpl>().InTransientScope();
        Bind<IJobWsWrapper>().To<JobWsWrapperImpl>().InTransientScope();

        // View model factory bindings
        Bind<IPermanentEmployeeViewModelFactory>().To<PermanentEmployeeViewModelFactoryImpl>().InTransientScope();
    }
}

Итак, мой вопрос: есть ли способ указать привязки моего модуля Ninject в моем тесте MSpec, а затем использовать этот экземпляр для моего экземпляра контроллера? Я хочу избежать создания экземпляра моего контроллера следующим образом: var controller = new Controller (), поскольку это не позволяет мне проверять привязки Ninject. Я также изучил класс TestControllerBuilder из библиотеки MvcContrib, но я не понял, как создавать экземпляры контроллеров с привязками Ninject. Спасибо за помощь!

1 Ответ

1 голос
/ 03 февраля 2012

Хорошо, я выяснил, как инициализировать мой контроллер вместе с привязками Ninject в моих тестах MSpec! Ну, я не понял это. Сотрудник сделал, но это не имеет значения сейчас. Вот как это делается:

    public class when_permanent_employee_page_is_loaded_for_first_time
{
    private static Mock<IJobService> jobServiceMock;
    private static Mock<IUtilsService> utilsServiceMock;
    private static PermanentEmployeeController controller;
    private static ContextMocks mocks;

    private static IList<Job> jobs = new List<Job>();
    private static IList<string> departments = new List<string>();
    private static IList<string> locations = new List<string>();
    private static PermanentEmployeeJobsViewModel viewModel;

    Establish context = () =>
        {    
            jobServiceMock = new Mock<IJobService>();
            jobServiceMock.Setup(x => x.GetJobs(1)).Returns(jobs);
            jobServiceMock.Setup(x => x.GetDepartmentsFromJobs(jobs)).Returns(departments);
            jobServiceMock.Setup(x => x.GetLocationsFromJobs(jobs)).Returns(locations);

            utilsServiceMock = new Mock<IUtilsService>();

            var kernel = new StandardKernel(new DefaultModule());
            kernel.Rebind<IJobService>().ToConstant(jobServiceMock.Object);
            kernel.Rebind<IUtilsService>().ToConstant(utilsServiceMock.Object);

            controller = kernel.Get<PermanentEmployeeController>();
            mocks = new ContextMocks(controller);
        };

    Because of = () =>
        {
            PartialViewResult view = (PartialViewResult)controller.Index();
            viewModel = (PermanentEmployeeJobsViewModel)view.ViewData.Model;
        };

    It should_load_all_available_jobs = () =>
        {
            jobServiceMock.Verify(x => x.GetJobs(1)); 
            jobServiceMock.Verify(x => x.GetDepartmentsFromJobs(jobs));
            jobServiceMock.Verify(x => x.GetLocationsFromJobs(jobs));
            viewModel.Departments.ShouldEqual(departments);
        };

    It should_load_all_available_locations;
    It should_load_all_available_departments;
}

Хорошо, вот и все :). Надеюсь, кто-то еще может получить пользу от этого ответа. Особая благодарность моему коллеге за выяснение этого. Вы знаете, кто вы есть: D

...