由于我是Web应用程序开发的新手,我目前在实现某些测试功能方面遇到了一些困难。
作为我目前工作的项目的一部分(用于处理付款的MVC 3 Web App)我被要求创建一个可以通过URL以这种方式访问的测试模式:
http://websiteurl?testmode=1
这背后的想法是,当其中一个开发团队将testmode参数添加到URL时,会自动生成一组表单值,以便在每次测试应用程序时节省输入数据的时间。
目前我在控制器中有一个if语句,它使用Request.QueryString设置下面的参数是我当前使用的代码:
if (Request.QueryString.AllKey.Contains("tm"))
{
if (Request.QueryString["tm"] == 1)
{
insert values to be generated
}
}
考虑到背景,如果有什么是实现这一目标的最佳方法?
是否可以使用模拟框架(如Moq或RhinoMocks)创建虚假存储库而不是从数据库中检索结果,或者将数据库中预先加载测试数据更好?
答案 0 :(得分:2)
首先,我将封装您的“TestMode”检查。
我会创建一个基本控制器并添加以下属性:
// 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;
}
这是不合适的。让我们考虑如何插入值。我在这里做了一些假设,但我有兴趣让控制器单元测试。
我假设您的数据是从某些IDataRepository
返回的,并且您有两个存储库实现:FakeDataRepository和ReadDataRepository。
然后,您可以编写工厂或简单的ifelse语句来决定使用哪个存储库。
IDataRepository DataRepository { get; set; }
if (Request.IsTestContext)
DataRepository = new FakeDataRepository();
else
DataRepository = new RealDataRepository();
这对你想做的事情有用,但在我看来这不是一个好的方法。我会考虑对您的控制器进行单元测试。你能否提供更多关于你想测试的细节,因为我在这里做了很多假设和猜测?
答案 1 :(得分:0)
为了便于您了解应用程序目前的布局,我提供了以下详细信息:
应用程序的基本结构遵循项目丝绸模板,将应用程序分解为业务逻辑,数据层,演示和单元测试,我实现此测试模式的控制器已经从基本控制器继承,该控制器当前包含实现Microsoft.Practices.ServiceLocation模式。
服务定位器访问在业务逻辑域项目中找到的四个服务,其中三个访问存储库包含三个下拉列表的值,第四个访问已经集成的支付解决方案(SagePay)的事务服务的实现进入应用程序,这使用SagePayMvc.dll。
所有存储库都从Base Repository继承我目前有六个继承自此库的存储库,另外三个用于填充下拉列表,其他三个存储信息关于学生,持卡人和订单详细信息,testmode基本上是访问学生资料库目前正在填写学生详细信息表格,目前可以使用JQuery填充持卡人详细信息。
在业务逻辑中有两组模型,另一组在数据层中,模型验证在业务逻辑域中定义。
我访问模型的视图模型目前正在使用域模型。
为了创建我使用Entity Framework Code First方法的存储库,它当前将存储库创建为数据库,其中表对应于每个定义的模型。
此测试模式的目的是快速填充非唯一表单字段(我目前有一些逻辑实现阻止学生输入已存在的名称),以便当团队的其他成员使用该应用程序时可以快速评估应用程序是否正常工作,尤其是设计团队将样式应用于应用程序。
我目前有一个测试类设置正在测试学生资源库可以创建一个新学生的断言,我在这里定义的数据访问使用Moq定义的假存储库。