很多时候我们系统需要连一些第三方的api,有时候我们系统要根据api返回结果走不同的分支,这个时候如果需要测试覆盖所有分支,那么我们通常有三种做法。
1.纯人工,让第三方配合测试,覆盖所有分支,正常都会走一遍,但是做多了,对方烦了,他认为自己系统没问题,没义务配合你了。
2.程序内部增加内部测试代码,方法不访问api,而是直接返回测试要的输出值。这种方法缺点很明显,一是不能模拟http请求,二是不好维护。还有测试代码总不能提交到正式环境吧,即使是不会调用的代码。
3.自己搭建一个api服务器。只要修改程序访问的api地址,就可以测试了,方便,不破坏原程序。
综上,我们选择第三种方式。并使用.net的mvc来做这个模拟器。
既然要做http模拟器,那么一般思路就是,我们有n个请求地址,我们就写几个action还响应,但是这样我们以后要扩展还得该模拟器,这可不行。那么我们就只用1个action来响应所有的请求吧。
怎么用1个action响应所有请求呢,首先我第一个想到的是捕获404错误,然后重定向到action里面处理。
然后我配置了web.config的customErrors,但是这样的话重定向后,只能带上原地址,其他页面请求参数都没有,这个可不行。
如果不用配置,那我写Application_Error和HandleErrorAttribute应该可以捕获了吧,结果发现还是不行,调试时,404根本不进这两个方法。
看来靠捕获404,来重定向这个方案是行不通的。这个时候我想到了mvc不是可以自定义路由吗,我写个全匹配的路由规则不就可以了吗?试了下果然可以,代码如下:
routes.MapRoute(
name: "Default",
url: "{*anything}",
defaults: new { controller="Default",action="Index"}
剩下的工作无非是在action中写“接受请求参数->判断请求参数->根据请求读取不同的结果文件->将结果输出”的代码,简单易操作,就不详解了。