最小起订量单元测试失败- ASP.净MVC

本文关键字:ASP MVC 失败 单元测试 | 更新日期: 2023-09-27 18:11:36

有人可以帮助解释为什么这是失败的?我想我可以查到它和user。identity。name有关。它在"Act"失败,我得到一个System.NullReferenceException。但是,同一控制器中的另一个方法可以工作。

工作测试

[TestMethod]
public void Home_Index_Returns_ActionResult()
{
    //Arrange
    var mockRepository1 = new Mock<IEditDataRepository>();
    var mockRepository2 = new Mock<IIdentityRepository>();
     mockRepository1
             .Setup(x => x.Edit(It.IsAny<UTCFormViewModel>(), It.IsAny<string>()));
    HomeController controller = new HomeController(mockRepository1.Object, mockRepository2.Object);
    //Act
    ActionResult result = controller.Index();
    //Assert
    Assert.IsInstanceOfType(result, typeof(ActionResult));
}

NOT WORKING TEST(在不同的方法上)

[TestMethod]
public void Edit_Method_Test()
{
    //Arrange
    var mockRepository1 = new Mock<IEditDataRepository>();
    var mockRepository2 = new Mock<IIdentityRepository>();
    mockRepository1
         .Setup(x => x.Edit(It.IsAny<UTCFormViewModel>(), It.IsAny<string>()));
    HomeController controller = new HomeController(mockRepository1.Object, mockRepository2.Object);
    //Act (Fails Here)
    controller.Edit(It.IsAny<UTCFormViewModel>());
    //Assert
    mockRepository1.VerifyAll();
    mockRepository2.VerifyAll();
}
控制器

namespace UTC.Controllers
{
    [Authorize]
    public class HomeController : Controller       
    {
        private IEditDataRepository _editDataRepository;
        private IIdentityRepository _identityRepository;
        public HomeController(IEditDataRepository editDataRepository, IIdentityRepository identityRepository )
        {
            _editDataRepository = editDataRepository;
            _identityRepository = identityRepository;
        }
        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "Field1, Field2")] UTCFormViewModel model)
        {
            if (ModelState.IsValid)
            {
                string fullWindowsUser = User.Identity.Name;
                string windowsUser = _identityRepository.GetWindowsUser(fullWindowsUser);
                _editDataRepository.Edit(model, windowsUser);
                return new HttpStatusCodeResult(HttpStatusCode.OK);
            }
            else
            {
                throw new HttpException(400, "ModelState Invalid");
            }
        }
    }    
}

namespace UTC.Repositories
{
    public class IdentityRepository : IIdentityRepository
    {
        public string GetWindowsUser(string fullWindowsUser)
        {
            //Strip off the domain and lower text
            var windowsUser = fullWindowsUser.ToString().ToLower().Split('''')[1];
            return windowsUser;
        }
    } 
}

namespace UTC.Repositories
{
    public class EditDataRepository : IEditDataRepository
    {
        private UTCEntities db = new UTCEntities();
        public void Edit(UTCFormViewModel model, string windowsUser)
        {
            db.ustp_UTCUpdate(windowsUser, model.Field1, model.Field2)
        );
    }        
}

最小起订量单元测试失败- ASP.净MVC

您正在访问User.Identity.Name,但是控制器的User属性没有在您的测试方法中设置,因此当访问

时它将为空。

您将需要使用虚拟用户帐户设置控制器上下文。下面是一个助手类,您可以使用它来模拟获取用户主体所需的HttpContext

private class MockHttpContext : HttpContextBase {
    private readonly IPrincipal user;
    public MockHttpContext(string username, string[] roles = null) {
        var identity = new GenericIdentity(username);
        var principal = new GenericPrincipal(identity, roles ?? new string[] { });
        user = principal;
    }
    public override IPrincipal User {
        get {
            return user;
        }
        set {
            base.User = value;
        }
    }
}
在您的测试中,初始化目标控制器之后,您需要设置控制器上下文
//...other code removed for brevity
var controller = new HomeController(mockRepository1.Object, mockRepository2.Object);
controller.ControllerContext = new ControllerContext {
    Controller = controller,
    HttpContext = new MockHttpContext("fakeuser@example.com")
};
//...other code removed for brevity