如何从Test类认证或登录到Controller

时间:2015-03-17 09:13:47

标签: c# asp.net-mvc unit-testing asp.net-identity vs-unit-testing-framework

我想使用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);

        }

如果我必须在单元测试中创建登录,请详细告诉我如何登录

1 个答案:

答案 0 :(得分:0)

HttpContext.User属性正在处理托管应用程序。在测试环境中,这将为null。因为HttpContext.User不是由测试框架设置的。所以你应该通过模拟FakeiteasyMoq

之类的框架来创建一个假对象

如果您使用的是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方法正在调用数据库,你也应该伪造它。