C# 为功能测试调用控制器上的授权

C# 为功能测试调用控制器上的授权,c#,asp.net-mvc-3,unit-testing,authorization,action-filter,C#,Asp.net Mvc 3,Unit Testing,Authorization,Action Filter,在我正在进行的一个项目中,我终于到了为项目的一部分编写SpecFlow特性测试的地步 但是,有一个小问题——我们的应用程序中有一个授权过滤器,我需要为一些测试调用它 授权过滤器看起来有点像这样(这里有很多修订) …在我的功能测试中,我试图在一个特殊的给定步骤中调用它: [Given(@"I am logged in as (.*)")] public void GivenIAmLoggedInAsX(string userId) { _controller = new SpecificC

在我正在进行的一个项目中,我终于到了为项目的一部分编写SpecFlow特性测试的地步

但是,有一个小问题——我们的应用程序中有一个授权过滤器,我需要为一些测试调用它

授权过滤器看起来有点像这样(这里有很多修订)

…在我的功能测试中,我试图在一个特殊的给定步骤中调用它:

[Given(@"I am logged in as (.*)")]
public void GivenIAmLoggedInAsX(string userId)
{
    _controller = new SpecificController();
    _controller.ControllerContext = new ControllerContext(new HttpContextMock(), new RouteData(), _controller);

    Authorization authorize = new Authorization();
    AuthorizeContext authContext = new AuthorizationContext(_controller.ControllerContext);
    authorize.OnAuthorization(authContext);

    // SNIP: Other activities that don't pertain to the question.
}
…通过在我正在构建的测试用例上生成许多
notimplementedException
,这不起作用

在询问我的团队之后,有人提到了MVC中的
ControllerActionInvoker
类。可悲的是,该软件在细节上有点粗制滥造,比如如何最好地使用它

此外,在我试图找出如何使用ControllerActionInvoker的过程中。也帮不了什么忙

我尝试了两种不同的方法作为临时措施,但都没有产生任何效果,也带来了很多挫折

问题:在我正在进行的功能测试中,我绝对需要调用此过滤器,而直接方法不起作用。为特性测试调用过滤器的最佳方法是什么

旁注:整个MVC过滤系统对我来说都是未经探索的领域,所以有很多我不知道。在你的回答中,假设我几乎什么都不知道,因为这可能是准确的,即使我已经做了关于如何做到这一点的研究

Alt实现#1

我发现我的原始示例使用了一个过时的构造函数;建议使用2-arg构造函数。所以,我用它没有好的效果。下面是它的样子(仍然是直接方法:)


根据我的经验,我建议使用单元测试或集成测试来测试OnAuthorization的功能


我将使用Specflow和web驱动程序纯粹从浏览器上下文测试场景,即仅通过与网站交互来测试功能。因此,您的“给定”应该只使用web驱动程序来验证用户是否已以“用户ID”身份登录,例如,通过检查网页上是否存在他们的姓名或类似内容。

根据我的经验,我建议使用单元或集成测试来测试OnAuthorization的功能

我将使用Specflow和web驱动程序纯粹从浏览器上下文测试场景,即仅通过与网站交互来测试功能。因此,您的“给定”应该只使用web驱动程序来验证用户是否已以“用户ID”身份登录,例如,通过检查网页上是否存在他们的姓名或类似的内容

[Given(@"I am logged in as (.*)")]
public void GivenIAmLoggedInAsX(string userId)
{
    _controller = new SpecificController();
    _controller.ControllerContext = new ControllerContext(new HttpContextMock(), new RouteData(), _controller);

    Authorization authorize = new Authorization();
    AuthorizeContext authContext = new AuthorizationContext(_controller.ControllerContext);
    authorize.OnAuthorization(authContext);

    // SNIP: Other activities that don't pertain to the question.
}
[Given(@"I am logged in as (.*)")]
public void GivenIAmLoggedInAsX(string userId)
{
    _controller = new RequestFormController();
    _controller.ControllerContext = new ControllerContext(new HttpContextMock(), new RouteData(), _controller);

    Authorization authorize = new Authorization();
    MethodInfo method = typeof (MyController).GetMethod("MyAction");
    ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(typeof(MyController));
    ActionDescriptor actionDescriptor = new ReflectedActionDescriptor(method, "MyAction", controllerDescriptor);
    AuthorizationContext authContext = new AuthorizationContext(_controller.ControllerContext, actionDescriptor);
    authorization.OnAuthorization(authContext);

    // SNIP: Unrelated code.
}