c# - 通过将值插入表单的 url 参数创建测试模式

标签 c# asp.net-mvc-3 testing mocking query-string

由于我是 Web 应用程序开发的新手,我目前在实现某些测试功能时遇到了一些困难。

作为我目前正在工作的项目的一部分(用于处理付款的 MVC 3 Web 应用程序),我被要求创建一个可以通过 URL 以这种方式访问​​的测试模式:

http://websiteurl?testmode=1

这背后的想法是,当其中一个开发团队将 testmode 参数添加到 URL 时,会自动生成一组表单值,以便在每次测试应用程序时节省输入数据的时间。

目前我在 Controller 中有一个 if 语句,它使用 Request.QueryString 来设置下面的参数是我目前正在使用的代码:

if (Request.QueryString.AllKey.Contains("tm"))
{
     if (Request.QueryString["tm"] == 1)
     {
         insert values to be generated
     }
}

在给定上下文的情况下,实现此目标的最佳方法是什么?

是否可以使用 Moq 或 RhinoMocks 等模拟框架来创建虚假存储库而不是从数据库中检索结果,或者将测试数据预加载到数据库中会更好吗?

最佳答案

首先,我将封装您的“TestMode”检查。

我会创建一个基本 Controller 并添加以下属性:

// I would consider retrieving this from web.config
protected string testModeKey = "tm";

public bool IsTestContext
{
   get
   {
      return Request.QueryString[testModeKey] != null;
   }
}

或者,考虑为 HttpRequest 编写一个扩展方法:

public static bool IsTestContext(this HttpRequest request, string testModeKey = "tm")
{
   request.QueryString[testModeKey] != null;
}

这不对。让我们考虑一下如何插入值。我在这里几乎没有做任何假设,但我对使 Controller 单元可测试感兴趣。

我假设您的数据是从某个 IDataRepository 返回的,并且您有两个存储库实现:FakeDataRepository 和 ReadDataRepository。

然后您可以编写工厂或简单的 ifelse 语句来决定使用哪个存储库。

IDataRepository DataRepository { get; set; }

if (Request.IsTestContext)
   DataRepository = new FakeDataRepository();
else
   DataRepository = new RealDataRepository();

这可以满足您的要求,但我认为这不是一个好的方法。我会研究对您的 Controller 进行单元测试。您能否提供有关您想要测试的内容的更多详细信息,因为我在这里做了很多假设和猜测?

关于c# - 通过将值插入表单的 url 参数创建测试模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12279209/

相关文章:

java - Mockito.when 在测试方法体内不起作用

angular - 如何在订阅中测试 setter ? Angular

c# - 正则表达式 c# 只有正数

c# - 从 SQL Server 数据库格式化十进制值

c# - 如何制作包含唯一条目的列表?

asp.net-mvc-3 - MVC3 和 KnockoutJS DRYly

c# - 在jquery中构建数组

c# - 如何从 View 模型中触发对 View 中对象的方法调用

c# - 如何正确使用try-catch语句

android - 依赖 SQLite 中数据的 Robotium Activity 测试