Модульное тестирование контроллера, который зависит от переменной сеанса - PullRequest
1 голос
/ 26 января 2012

У меня есть контроллер, который зависит от переменной Session.Для модульного тестирования этого контроллера я предложил следующее решение.Это работает, но мне интересно, есть ли лучший / более чистый способ.Спасибо

Контроллер

    public JsonResult UpdateStatus(ImageUpdateStatus imageUpdateStatus, SessionStateItemCollection sessionItems = null)
    {
        var data = new object();
        string status = null;

        ImageInfo imageInfo = new ImageInfo();
        IImageInfoServices svcImageInfo = new ImageInfoServicesRepository();
        imageInfo = svcImageInfo.GetImageByImageId(imageUpdateStatus.ImageId);

        IDeviceControlServices svcDevice = new DeviceControlServicesRespository();
        IPVSCommandServices svcPVSCmds = new PVSCommandServicesRespository();

        if (imageUpdateStatus.Task == "prep")
        {
            List<UpdateReasonForm> updateReasonForms;

            if (sessionItems != null)
            {
                updateReasonForms = sessionItems["UpdateReasonForms"] as List<UpdateReasonForm>;
            }
            else
            {
                updateReasonForms = Session["UpdateReasonForms"] as List<UpdateReasonForm>;
            }

            foreach (var item in updateReasonForms)
            {
                if (item.ImageId == imageInfo.ImageId)
                {
                    status = svcPVSCmds.PrepImage(imageInfo, item.NewVersion);
                }
            }

            data = new
            {
                status
            };
        }

        if (imageUpdateStatus.Task == "boot")
        {
            status = svcDevice.Boot(imageInfo.ImageId);

            data = new
            {
                status
            };
        }

        return this.Json(data, JsonRequestBehavior.AllowGet);
    }

Модульный тест

        [TestMethod()]
    public void UpdateStatusTest()
    {
        BuildController target = new BuildController(); // TODO: Initialize to an appropriate value
        ImageUpdateStatus imageUpdateStatus = new ImageUpdateStatus(); // TODO: Initialize to an appropriate value
        imageUpdateStatus.ImageId = 3;
        imageUpdateStatus.Task = "prep";
        UpdateReasonForm updateReasonForm = new UpdateReasonForm();
        updateReasonForm.ImageId = 3;
        updateReasonForm.NewVersion = "TestThis";

        List<UpdateReasonForm> updateReasonForms = new List<UpdateReasonForm>();
        updateReasonForms.Add(updateReasonForm);

        var sessionItems = new SessionStateItemCollection();
        sessionItems["UpdateReasonForms"] = updateReasonForms;

        JsonResult actual;
        actual = target.UpdateStatus(imageUpdateStatus, sessionItems);
    }

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Вместо того, чтобы передавать значения сеанса в качестве параметра, вы можете смоделировать состояние сеанса, как здесь:

Как смоделировать коллекцию объектов сеанса с помощью Moq

1 голос
/ 26 января 2012

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

 public JsonResult UpdateStatusDependencyInjection(ImageUpdateStatus imageUpdateStatus, Dictionary<string, object> sessionValues)
        {
        var data = new object();
        string status = null;

        ImageInfo imageInfo = new ImageInfo();
        IImageInfoServices svcImageInfo = new ImageInfoServicesRepository();
        imageInfo = svcImageInfo.GetImageByImageId(imageUpdateStatus.ImageId);

        IDeviceControlServices svcDevice = new DeviceControlServicesRespository();
        IPVSCommandServices svcPVSCmds = new PVSCommandServicesRespository();

        if (imageUpdateStatus.Task == "prep")
        {
            List<UpdateReasonForm> updateReasonForms;

            if (sessionItems != null)
            {
                updateReasonForms = sessionItems["UpdateReasonForms"] as List<UpdateReasonForm>;
            }
            else
            {
                updateReasonForms = Session["UpdateReasonForms"] as List<UpdateReasonForm>;
            }

            foreach (var item in updateReasonForms)
            {
                if (item.ImageId == imageInfo.ImageId)
                {
                    status = svcPVSCmds.PrepImage(imageInfo, item.NewVersion);
                }
            }

            data = new
            {
                status
            };
        }

        if (imageUpdateStatus.Task == "boot")
        {
            status = svcDevice.Boot(imageInfo.ImageId);

            data = new
            {
                status
            };
        }

        return this.Json(data, JsonRequestBehavior.AllowGet);
    }
0 голосов
/ 26 января 2012

http://codingsmith.co.za/a-better-way-of-working-with-httpcontext-session-in-mvc/

Это моя реализация оболочки интерфейса для Session.В настоящее время он находится в производстве и работает нормально, его вводят в мои контроллеры, но я могу использовать одну из других реализаций вручную при тестировании

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...