yeleswarapu ramakrishna Ответов: 1

Проблема издевательства над модульным тестированием


ниже приведен метод, который я пытался протестировать, но он не работает для сотрудника.Текущий сотрудник.IsManager это логическое значение извлекается из вложенного класса который зависит от сеанса поэтому когда я запускаю модульный тест для этого он терпит неудачу потому что нет сеанса созданного во время выполнения модульного теста поэтому я попытался издеваться над объектом

public ActionResult IndexCompleted(PlanModel model)
        {
            int PlanID = model.Plan.PlanID;
            ViewBag.Title = "Plan Number: " + PlanID;
            //Only managers can access the plans (the bride now works at the chapel)
            if ((PlanID == 387484 || PlanID == 765675 || PlanID == 872095 || PlanID == 900535) && !Employee.CurrentEmployee.IsManager)
            {
                return Content("Unauthorized");
            }
            return View(model);
        }


Что я уже пробовал:

я пытаюсь создать макет объекта но не могу его создать потому что у меня нет интерфейса
[Test]
        public void FetchingPlanModelObjectIfYouAreManagerElseUnauthorized()
        {
            PlanController planController = new PlanController();
            PlanModel planmodel = new PlanModel()
            {
                Plan = new LittleChapel.Plan()
                {
                    PlanID = 387484
                }
            };
            Mock<iemployee> objMock = new Mock<iemployee>();
            objMock.Setup(x => Employee.CurrentEmployee.IsManager).Returns(true);
            //objMock.SetupProperty(x => x.IsManager,true);
            //objMock.Setup(x=>x.IsManager).Returns(true);
            var plan = planController.IndexCompleted(planmodel) as ViewResult;
            Assert.AreEqual(planmodel, plan.ViewData.Model);
        }

Bernhard Hiller

То есть интерфейса "iemployee" не существует? Или что-то еще? Расскажите нам дословное сообщение об ошибке, и это ошибка времени компиляции или ошибка времени выполнения?

Scyldshefing

Учитывая, что Employee реализует IEmployee и оба эти класса определены, как вы вводите макет объекта (objMock. Object) в тестируемый код? Ваш фрагмент кода не показывает объявление объекта Employee в тестируемом коде.
Чтобы сделать что-то подобное (инъекция зависимостей) Я использую Microsoft Unityframework (https://msdn.microsoft.com/en-us/library/ff647202.aspx )

1 Ответов

Рейтинг:
1

FranzBe

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

void Main()
{
	var a = new PlanAuthorizationProvider();
	var result = a.IsAuthorized(true, 387484);
	//result.Dump();   // this is for linqpad 
}

public interface IPlanAuthorizationProvider
{
  bool IsAuthorized(bool isManager, int planId);
}

public class PlanAuthorizationProvider : IPlanAuthorizationProvider
{
  public bool IsAuthorized (bool isManager, int planId)
  {
   // this goes in your app.config
   //  < appSettings >
   //    < add key = "managerOnlyPlanIds" value = "387484,765675,872095,900535" />
   //  </ appSettings >
   //string managerOnlyPlantIds = ConfigurationManager.AppSettings["managerOnlyPlanIds"];
   string managerOnlyPlanIds = "387484,765675,872095,900535";
   var listOfManagerOnlyPlanIds = 
          managerOnlyPlanIds.Split(',').Select(int.Parse).ToList();
   if (listOfManagerOnlyPlanIds .Contains(planId))
   {
     return isManager;
   }
   else
   {
     return true;
   }
 }	 
}