Как пройти аутентификацию или войти из тестового класса в контроллер

Я хочу протестировать свой проект с помощью модульного теста Visual Studio, но он выдает ошибку нулевой ссылки User.Identity.GetUserID(), есть ли способ издеваться над ним или мне нужно войти в систему через модульный тест. Я много искал, но не нашел решения.

вот код для проверки

 public PartialViewResult _AdmitPatient(int id)
        {
            if (cFunctions.AllowAccessToRecord((int)id, User.Identity.GetUserId(), "patient") == false)
            {
                return null;
            }
            Admission admission = new Admission();
            admission.PatientID = id;
            return PartialView(admission);
        } 

Вот модульный тест для этого кода

 [TestMethod]
        public void TestAdmitPatView()
        {
            var adc = new AdmissionController();

            var res = adc._AdmitPatient(6);


            Assert.AreEqual(adm.PatientID, res.ViewData);

        }

если мне нужно создать авторизованный модульный тест, пожалуйста, расскажите мне подробно, как войти в систему


person Syed Anwar Shah Tarn    schedule 17.03.2015    source источник
comment
Вы должны отделить свою логику от контроллера и протестировать ее оттуда. Тестировать контроллеры сложно, потому что вы не используете http-запросы для их вызова.   -  person James Sampica    schedule 17.03.2015
comment
пожалуйста, скажите мне, как его следует протестировать. Я запрашиваю то же, что вы ответили, я получаю нулевую ссылку, поэтому как я могу получить значение, и я думаю, что мне нужно войти из теста в контроллер, если это решение, то, пожалуйста, скажите мне, как войти и добавить претензии в тесте   -  person Syed Anwar Shah Tarn    schedule 18.03.2015
comment
Вам нужно издеваться над своей личностью с конкретным утверждением. См. мой ответ здесь stackoverflow.com/a/39898952/2672291   -  person Haohmaru    schedule 06.10.2016


Ответы (1)


Свойство HttpContext.User работает с размещенным приложением. Это будет нулевым в тестовой среде. Поскольку HttpContext.User не задается тестовыми фреймворками. Итак, вы должны создать поддельный объект с помощью фиктивных фреймворков, таких как Fakeiteasy или Moq

Если вы используете FakeItEasy, вы можете создать объект:

[TestMethod]
public void TestAdmitPatView()
{
    var adc = new AdmissionController();

    adc.ControllerContext = A.Fake<ControllerContext>();
    var fakePrincipal = A.Fake<IPrincipal>();
    var fakeIdentity = new GenericIdentity( "username" );
    A.CallTo( () => fakePrincipal.Identity ).Returns( fakeIdentity );
    A.CallTo( () => HomeController.ControllerContext.HttpContext.User ).Returns( fakePrincipal );

    var res = adc._AdmitPatient(6);

    Assert.AreEqual(adm.PatientID, res.ViewData);
}

если ваш метод cFunctions.AllowAccessToRecord вызывает базу данных, вы также должны подделать его.

person Bayram Üçüncü    schedule 17.03.2015
comment
что такое A и контекст контроллера не является статическим, пока вы вызываете его из класса контроллера - person Syed Anwar Shah Tarn; 18.03.2015
comment
ControllerContext предоставит информацию о HTTP-запросе для указанного контроллера. A является объектом фреймворка FakeItEasy. - person Bayram Üçüncü; 18.03.2015