[asp.net-mvc]在.net MVC HttpContext 测试我控制器抛出错误

发布时间: 2017/3/25 12:38:08
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个控制器 HttpContext 喜欢那个电话︰

[Authorize(Roles = "Administrador")]
public class ApuradorController : Controller
{
    private readonly Questiona2011Context _context = new Questiona2011Context();

    private readonly AuthenticationService _authenticationService = new AuthenticationService();
}

HttpContext 是调用认证班︰

public class AuthenticationService
{
    private IPrincipal _user = HttpContext.Current.User;

    ...
}

在我的项目在哪里 im 测试控制器时我实例控制器则会引发错误 private IPrincipal _user = HttpContext.Current.User; 线︰对象未引用设置到对象的实例。

测试我的控制器时需要执行什么?

解决方法 1:

你错过的主要的是如何设计用于测试的 ASP.NET MVC 项目的知识。

你应该设计您的控制器使用依赖注入。也就是说,控制器不应使用具体实施的认证,但使用 IAuthenticationService,其中具体实施将提供在运行时。现在,该控制器在创建时,认证也是。但在测试场景中,HttpContext 为 null,创建认证失败,NullReference 异常。如果你设计,通过接口,在测试目的,您将供应假执行认证到控制器,和它不会引发异常。

public interface IAuthenticationService
{
    IPrincipal User {get;}
}

public class AuthenticationService : IAuthenticationService
{
    private IPrincipal _user = HttpContext.Current.User;

    ...
}

//the controller
[Authorize(Roles = "Administrador")]
public class ApuradorController : Controller
{
    private readonly Questiona2011Context _context = new Questiona2011Context();

    private readonly IAuthenticationService _authenticationService;

    public ApuradorController(IAuthenticationService authenticationService)
    {
         _authenticationService = authenticationService;
    }
}

在测试场景中,您可以使用一些嘲弄的图书馆为假 IAuthenticationService 执行,例如最小起订量。和通过嘲笑为它提供值

var mockAuthenticationService = new Mock<IAuthenticationService>();
//setup mockAuthenticationService

var controller = new ApuradorController(mockAuthenticationService.Object);

这一次它不会引发异常。

如上文所述的信息不是设计的有益的如果你不理解的单元测试项目原则。为快速开始,读链接。为进一步读书,地址关于 asp.net mvc 中,建议那些由史蒂文 · 桑德森。单元测试控制器设计的主要思想是控制器的你应该有能力供应控制器、 假资料库、 服务等的假组件和离开真正的是控制器的单元测试仅部分。然后测试控制器 iteractions 与那些假的地方。单元测试意味着测试的相互作用。如果交互是正确的他们将是正确与这些组件的真正实现。如果他们错了,测试失败。

官方微信
官方QQ群
31647020