动作过滤器的 ASP.NET MVC 测试

2024-01-30

如何为操作过滤器编写测试用例?我正在使用表单身份验证。 我有用 RequiresAuthentication 操作过滤器装饰的基本控制器。当我执行控制器的测试用例时,我没有从 cookie 中获取登录用户的数据。

我正在使用起订量;它是否提供了实现我的目标的方法?


This 博客文章 http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx来自 Scott Hanselmann 的 MvcMockHelpers 介绍包括FakeHttpContext对于不同的模拟框架还有 Moq:

using System;
using System.Web;
using System.Text.RegularExpressions;
using System.IO;
using System.Collections.Specialized;
using System.Web.Mvc;
using System.Web.Routing;
using Moq;

namespace UnitTests
{
    public static class MvcMockHelpers
    {
        public static HttpContextBase FakeHttpContext()
        {
            var context = new Mock<httpcontextbase>();
            var request = new Mock<httprequestbase>();
            var response = new Mock<httpresponsebase>();
            var session = new Mock<httpsessionstatebase>();
            var server = new Mock<httpserverutilitybase>();

            context.Expect(ctx => ctx.Request).Returns(request.Object);
            context.Expect(ctx => ctx.Response).Returns(response.Object);
            context.Expect(ctx => ctx.Session).Returns(session.Object);
            context.Expect(ctx => ctx.Server).Returns(server.Object);

            return context.Object;
        }

        public static HttpContextBase FakeHttpContext(string url)
        {
            HttpContextBase context = FakeHttpContext();
            context.Request.SetupRequestUrl(url);
            return context;
        }

        public static void SetFakeControllerContext(this Controller controller)
        {
            var httpContext = FakeHttpContext();
            ControllerContext context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
            controller.ControllerContext = context;
        }

        static string GetUrlFileName(string url)
        {
            if (url.Contains("?"))
                return url.Substring(0, url.IndexOf("?"));
            else
                return url;
        }

        static NameValueCollection GetQueryStringParameters(string url)
        {
            if (url.Contains("?"))
            {
                NameValueCollection parameters = new NameValueCollection();

                string[] parts = url.Split("?".ToCharArray());
                string[] keys = parts[1].Split("&".ToCharArray());

                foreach (string key in keys)
                {
                    string[] part = key.Split("=".ToCharArray());
                    parameters.Add(part[0], part[1]);
                }

                return parameters;
            }
            else
            {
                return null;
            }
        }

        public static void SetHttpMethodResult(this HttpRequestBase request, string httpMethod)
        {
            Mock.Get(request)
                .Expect(req => req.HttpMethod)
                .Returns(httpMethod);
        }

        public static void SetupRequestUrl(this HttpRequestBase request, string url)
        {
            if (url == null)
                throw new ArgumentNullException("url");

            if (!url.StartsWith("~/"))
                throw new ArgumentException("Sorry, we expect a virtual url starting with \"~/\".");

            var mock = Mock.Get(request);

            mock.Expect(req => req.QueryString)
                .Returns(GetQueryStringParameters(url));
            mock.Expect(req => req.AppRelativeCurrentExecutionFilePath)
                .Returns(GetUrlFileName(url));
            mock.Expect(req => req.PathInfo)
                .Returns(string.Empty);
        }
    }
}

ASP.NET MVC 测试助手的另一个好资源是MvcContrib http://mvccontrib.codeplex.com/CodePlex 上的项目。

当你拥有一个FakeHttpContext您可以测试您的操作过滤器:

var context = new ActionExecutedContext();
context.HttpContext = MvcMockHelpers.FakeHttpContext();
context.Result = new EmpytResult(); // or whatever the default result should be

var filter = new MyCustomAttribute();
filter.OnActionExecuted(context);

Assert.True(context.Result is EmpytResult);
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动作过滤器的 ASP.NET MVC 测试 的相关文章

  • 使用默认的 ASP.Net MVC 设置,如何使用 Microsoft 帐户登录?

    为什么我不断收到 输入参数 redirect uri 提供的值无效 我的网站托管在 Azure 中 我正在尝试通过 Microsoft 登录按钮登录 我并没有对默认的 ASP Net MVC 开箱即用模板进行太多更改 我真正改变的只是取消注
  • 如何在 MVC4 的 UserProfile 中创建自定义附加字段

    我遇到了新的 ASP MVC 4 功能 它附带了新的成员资格数据库模式和新的初始化 在 mvc 3 和旧版本中 开发人员能够使用 web config 中的规范创建自定义用户配置文件字段 但现在我面临默认 mvc 4 项目中过滤器命名空间中
  • MVC 下拉列表未映射到模型

    我正在尝试使用 EF codefirst 在 MVC 3 中开发应用程序 当我使用 int 属性和约定来设置外键关系时 例如 public class Patient public int ConsultantId get set 然后 我
  • Asp.Net 捆绑不使用 .min 文件

    根据发布模式下的文档 捆绑程序应该使用 min js 文件 如果存在 我通过以下方式添加角度 bundles Add new ScriptBundle Bundles Scripts Include Content Scripts angu
  • ASP.NET Core/MVC 6 ViewModel 中的依赖注入 (DI)

    我使用构造函数注入在控制器中成功使用了 ASP NET 5 MVC 6 DI 我现在有一个场景 我希望我的视图模型在实现 IValidatableObject 时在 Validate 方法中使用服务 ViewModel 中的构造函数注入不起
  • ASP.Net MVC 4 通用主要难点

    我正在开发一个ASP NET MVC 4Web应用程序 以前我的 MVC 应用程序是使用MVC 3和这个新的MVC 4我刚刚复制 重复使用了我的应用程序认证和授权码从以前的应用程序 当用户登录我的网站时 我会执行以下操作 账户控制器 pub
  • ASP MVC:何时调用 IController Dispose()?

    我正在对我的一个较大的 MVC 应用程序进行大规模重构 速度调整 它已经部署到生产环境几个月了 我开始在连接池中等待连接超时 我已将问题追溯到连接未正确处理的情况 鉴于此 我对我的基本控制器进行了以下更改 public class MyBa
  • ASP.NET MVC,Bootstrap Tables,获取每列的值

    在 ASP NET MVC 中 我有一个操作 它接受有关行和列的用户输入 然后导航到根据用户输入生成所需行数和列数的操作 如下所示 Views div class container style width 1px div class ro
  • mvc 登录尝试失败后生成验证码

    所以我能够让我的验证码工作正常工作 但我的问题是 我想让它只在 3 次尝试后出现 我的一个选择是将用户重定向到一个已经有验证码的视图 重复登录 但带有验证码 然后让他通过该页面登录 还有其他选择吗 我觉得部分视图会导致页面发布出现问题 您认
  • 在 ASP.NET MVC 中强制使用 Json() 中的小写属性名称

    鉴于以下课程 public class Result public bool Success get set public string Message get set 我将在控制器操作中返回其中之一 如下所示 return Json ne
  • 从mvc url中隐藏一个控制器名称,显示其他控制器名称

    我有两个控制器 HomeController 和 ResourcesController 当请求对 HomeController 执行操作时 我想从 url 中隐藏 Home 但对于 ResourcesController 或任何其他 co
  • mvc 2中的图像上传和预览

    我正在通过转换 asp net 网站来学习 mvc 2 在我的页面中 我必须上传图像并显示图像的预览 下面给出了我的 asp net 页面的屏幕截图 我将模型创建为 public class Contest public int conte
  • VS 2010、NUNit 和“当前不会命中断点。尚未为此文档加载任何符号”

    使用 Windows 7 32 位 VS 2010 NET 4 DLL NUnit 2 5 5 对应用程序进行单元测试 我目前收到以下错误 看了很多帖子并尝试了以下方法 重启机器 重启VS 删除 bin obj 并重新加载 清理 重建 但我
  • 显示 PDF ASP.Net MVC

    我的桌面上有一个文件用于测试 我试图在如下视图中显示它 ViewBag Title ShowFile h2 ShowFile h2 我用于控制器的代码是 HttpGet public ActionResult ShowFile string
  • ASP.NET MVC 显示配置文件中的用户名

    以下是LogOn来自 Visual Studio 创建的标准默认 ASP NET MVC 项目的用户控件 登录用户控件 ascx Welcome b b
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • asp.net mvc 它能处理所有请求吗? - iis 7集成模式

    我有一个使用 asp net mvc 构建的网站 在 IIS 7 上使用集成模式运行 我注意到 当我输入 mysite com test html 时 我得到了 The IControllerFactory did not return a
  • PostAsync 方法的 HttpClient 错误

    使用 HttpClient 对第 3 方 API 进行 PostAsync 调用时 当我执行 client PostAsync 时 我正好看到此错误 知道是什么原因造成的吗 Code public class JobController A
  • ASP.NET MVC 应用程序中的工作单元模式

    我一直在看这个优秀的blog http www nhforge org wikis patternsandpractices nhibernate and the unit of work pattern aspx标题为 NHibernat
  • (VS2017)运行所选代码生成器时出错:“序列不包含元素”

    我正在跑过微软的教程之一 https learn microsoft com en us aspnet core tutorials first mvc app 关于 MVC 开发 我在尝试创建各种元素时遇到错误 视图 控制器等 我收到的错

随机推荐

  • Symfony3 - 实体不适用于关系(具有索引和约束的数据库)

    现在主演了几个小时 也许我错过了一些明显的事情 具有此数据库结构 带有索引和约束 CREATE TABLE exploit id bigint 20 NOT NULL AUTO INCREMENT edb id varchar 100 CO
  • 意外的''回应宁静的服务

    我正在尝试学习宁静的服务 作为其中的一部分 我正在设计一个示例请求和响应页面 看看我一切都正确 除了以下内容 资源名为 i package com tutorialspoint import java io BufferedReader i
  • 如何忽略javafx中的60fps限制?

    我需要创建一个 100fps 动画来显示每秒包含 100 帧的文件中的 3D 数据 但是javaFx中的AnimationTimer只允许我获得60fps 如何克服它 删除 JavaFX 帧速率上限 您可以通过设置系统属性来删除 60fps
  • 在两级子例程中传递假定形状数组 (Fortran 90)

    我在 Fortran 90 中使用假定形状数组调用连续子例程时遇到问题 更具体地说 我调用两级子例程 传递假定形状数组作为参数 但最终数组丢失了 为了演示它 可以按照下面的代码进行操作 program main INTERFACE subr
  • 如何从FTP读取文件而不下载它们? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我的索引文件程序代码中 我需要访问 FTP 文件并读取所有文件而不下载它们 我如何使用 org apache commons net
  • 当 Android 使用嵌套片段和 getSupportFragmentManager() 在方向更改时重新创建我的应用程序时,到底会发生什么?

    我查看了与此问题相关的其他线程 它们似乎都使用 getChildFragmentManager 但如果可能的话 我想使用 getSupportFragmentManager 问题是这样的 我有父片段 A 它包含子片段 B B 是一个选择器片
  • 在两个不同宽度的弹性项目之间水平居中弹性项目[重复]

    这个问题在这里已经有答案了 假设我有 3 个 div 水平显示flexbox div1 center div wider div 我希望中心 div 与父级的中间对齐 我怎样才能做到这一点 justify content将根据所有宽度的总和
  • React 服务器渲染 --> 用新的根组件替换 React 渲染的子组件

    我正在尝试同构渲染反应 它会渲染 但我在客户端中收到警告 错误 我使用 jspm 和 npm 作为包管理器 warning js 25 Warning render Replacing React rendered children wit
  • Kruskal - R 数据子集的 Wallis p 值矩阵

    考虑一个数据集Data它有几个因子和几个数值连续变量 其中一些变量 比方说slice by 1 有 男性 女性 类别 和slice by 2 具有 悲伤 中性 快乐 类 用于将数据 切片 为子集 对于每个子集 Kruskal Wallis
  • Git Stash 上的 Git PathSpec 问题

    当我运行新版本时2 13 0 windows 1其新命令stash p pathspec as git stash p AB Dir1 Dir2 DestinationHierarchyCreator cs 它报告错误 错误 路径规范 AB
  • 使用 Int64 进行位移位

    Int64 变量需要移位 我正在从数据库文件解析伪数学函数 变量是 uint32 或 int32 所以我确实将它们放入 Int64 中以平等地处理它们 而不会丢失任何内容 在我的一个树节点中 我需要对 Int64 进行位移位 不幸的是 移位
  • Python,用PIL画一个圆

    我正在寻找一个命令 可以使用 PIL 在现有图像上绘制一个圆圈 im Image open path 我想要一个可以绘制半径为彩色的圆圈的函数r和中心 x y image Image open x png draw ImageDraw Dr
  • 如何对非常大的 CSV 文件进行排序?

    我有一个 294 000 行的大型 csv 其中第 1 列中包含 url 第 2 列中包含数字 我需要将它们从最小数到最大数排序 我已将其加载到 CSVed 软件中 它可以正常处理 不会崩溃或发生任何问题 但是当我单击列顶部对其进行排序时
  • 如何为 google colab 创建视频设备?

    我试图在 google collab 上使用 pygame 创建一个简单的游戏 但在执行代码 pygame display set mode 时 我收到错误 没有可用的视频设备 那么我该如何解决呢 您可以通过告诉 SDL 使用虚拟驱动程序来
  • 脚本在 PyCharm 中运行,但不是从命令行运行

    当我尝试从 PyCharm IDE 运行我的程序时 一切正常 但如果我输入 Fedora python myScript py 在 shell 提示符中 我从模块 1 中收到导入错误 ImportError No modue named m
  • 使用 Spring MVC 的 ResponseEntity 返回流

    我有一个 Spring MVC 方法 它返回一个ResponseEntity 根据检索到的具体数据 有时需要返回一个数据流给用户 有时它会返回流以外的其他内容 有时还会返回重定向 我绝对希望这是一个流而不是字节数组 因为它可能很大 目前 我
  • 如何在设备上部署aab文件?

    在我的 Android 应用程序中 如果我想更新 APK 文件 我会使用以下命令 adb install r some my apk 好的 是工作 现在我签署了我的捆绑包 结果是 Android Studio 3 5 产生 AAB Andr
  • 在 Javascript 中获取派生构造函数的名称

    在下面的示例中是否可以获取派生 类 的名称 我想以某种方式让输出为 ChildClass 但它是 ParentClass function ParentClass this name Bob function ChildClass this
  • 如何修复错误“无法解析列...”

    我正在开发基于 Spring Framework MySQL JPA 的 Java Web 应用程序 当我尝试将数据从 HTML 表单持久化到 SQL 数据库时遇到问题 然后我尝试调试和修复 我在用IntelliJ IDEA 旗舰版 201
  • 动作过滤器的 ASP.NET MVC 测试

    如何为操作过滤器编写测试用例 我正在使用表单身份验证 我有用 RequiresAuthentication 操作过滤器装饰的基本控制器 当我执行控制器的测试用例时 我没有从 cookie 中获取登录用户的数据 我正在使用起订量 它是否提供了