由于我是 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/