使用Selenium和ASP.net,如何将Mock传递给代码?

时间:2015-01-26 23:13:42

标签: asp.net selenium mocking moq code-behind

我正在针对本地IIS运行Selenium来提供页面并验证应用程序行为。我想在一些测试中模拟数据库。我已经使用了接口" proxy",所以我想用Mock替换我的实现,所以我只能验证调用逻辑层时使用的参数。任何人都可以推荐一个关于这个主题的合适的资源/教程/书籍吗?

场景:Page_Load()中填充了一个下拉列表。没有Page.IsPostBack的测试,所以即使在用户提交表单之后(以及事件处理程序之前),它也总是被重置。我正在编写一个回归测试来证明提交的值实际上是传递给提供者 - >存储库(以及扩展程序 - >数据库)。

谢谢!

1 个答案:

答案 0 :(得分:1)

背景

通常,在单元测试期间使用Moq(即测试中的单个类或系统层),而Selenium意味着浏览器自动化测试,而您的Selenium单元测试将不在WebForm的过程中。模拟的一个主要好处是它提供了验证/监视被测系统的能力,这通常需要在您要测试的类的进程内实例化,并直接注入模拟的依赖项--AFAIK这将丢失当用完程序时(使用Se进行测试时,您希望在部署状态下测试应用程序)。

从那以后,IMO WebForms页面并不真正有助于使用Moq进行这种单元测试:

  • 考虑到大量的环境依赖性,很难直接和孤立地创建WebForm - 例如需要模拟页面生命周期,并提供HttpContextSession等。
  • System.Web.Page不适用于Constructor或Setter injection

然而,那说,还有希望:

  • 可以应用改造来使Dependency Inversion principle mechanism使用WebForms。
  • 虽然在用完时你将丢失Moq的验证功能,但你仍然可以使用Moq来存根你的依赖并将假数据返回给WebForm(例如你的IRepository的存根依赖)。但是,为了执行验证,您需要找到另一种机制来记录您的依赖项的调用,例如通过记录到文件系统或数据库(或以某种方式将Moq编组回Se单元测试)。

所以这是一个想法:

  • 确保WebForms对存储库依赖项的访问通过接口解耦,然后使用Service Locator(1)获取存储库依赖项的实例以供WebForm使用(大多数IoC容器支持DI和服务定位器,例如统一)。
  • 将BootStrap配置(例如Unity RegisterInstance / RegisterType)移动到配置(2)中。通过这种方式,您可以替换实际的存储库,而无需编辑IoC引导代码,例如在Global.asax中切换真假存储库。
  • 在单独的程序集中创建一个Stub / Mock存储库(如果您使用Moq,您可能需要向创建Moq的IoC提供工厂,并返回记录每次调用的mock.Object),以及数据库的参数和时间戳。
  • 将此程序集复制到您的Dev Web服务器,并编辑IoC配置以重定向IRepository接口以指向您的虚拟存储库。
  • 进行Selenium测试。在每个操作之后,您需要查询验证数据库以断言正确的调用次数。您还需要在每次测试之前/之后进行清理。

(1)但是,在大多数情况下,依赖注入应该优先于服务定位器 (2)同样,这不是最佳实践,因为编译时安全性可能会丢失。然而,IoC通常具有“验证”配置机制,该机制至少可以部分地补偿这一点。

您可以考虑将您的表示层从WebForms移到ASP.Net MVC上,其中依赖注入和单元测试是一等公民,并且可以访问Moq验证;)