5

由于我对 Web 应用程序开发相当陌生,因此我目前在实现某些测试功能时遇到了一些困难。

作为我目前正在工作的项目的一部分(一个用于处理付款的 MVC 3 Web 应用程序),我被要求创建一个可以通过 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 等模拟框架来创建假存储库,而不是从数据库中检索结果,或者将测试数据预加载到数据库中会更好吗?

4

2 回答 2

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();

这将适用于您想要它做的事情,但在我看来这不是一个好的前进方式。我会考虑对您的控制器进行单元测试。你能提供更多关于你想测试什么的细节吗,因为我在这里做了很多假设和猜测?

于 2012-09-05T13:20:33.957 回答
0

为了让您了解有关应用程序当前布局的一些详细信息,我在下面提供了详细信息:

应用程序的基本结构遵循项目丝绸模板,将应用程序分解为业务逻辑、数据层、演示和单元测试,我正在实现此测试模式的控制器已经从一个基本控制器继承,该控制器当前包含一个实现Microsoft.Practices.ServiceLocation 模式。

服务定位器访问在业务逻辑域项目中找到的四个服务,其中三个访问存储库包含三个下拉列表的值第四个访问已集成到应用程序中的支付解决方案 (SagePay) 的交易服务的实现这使用 SagePayMvc.dll。

所有存储库都继承自基础存储库我目前有六个存储库继承自此基础,三个再次用于填充下拉列表中的其他三个存储信息,包括学生、持卡人和订单详细信息测试模式基本上是访问学生存储库目前正在填充学生详细信息表单,目前可以使用 JQuery 填充持卡人详细信息。

有两组模型,一组在业务逻辑中,另一组在数据层中,模型验证在业务逻辑域中定义。

我通过其访问模型的视图模型当前正在使用域模型。

为了创建存储库,我使用实体框架代码优先方法,它当前将存储库创建为数据库,其中表对应于每个定义的模型。

此测试模式的目的是快速填充非唯一的表单字段(我目前实现了一些逻辑来阻止学生输入已经存在的名称),以便当团队的其他成员使用该应用程序时,他们可以快速评估如果应用程序正在运行,则特别适用于设计团队,因为他们将样式应用于应用程序。

我目前有一个测试类设置,它正在测试学生存储库可以创建一个新学生的断言,我在此处定义的数据访问使用 Moq 定义的假存储库。

于 2012-09-06T08:02:41.890 回答