初识 PHPunit stub 模拟返回数据

这是这段时间以来结合 PHPunit 文档和大牛们的讲解,想记录下自己学习到的知识,未来参考补充,完善学到的东西

我们一般使用单测对公司业务里的代码进行测试,他会帮忙找到你的一个个小小的思考不够全面的地方。(虽然大牛说过开发可以先写单测再来写实现的代码,然而现在的我感觉离那个还是有好多距离来着)

  stub(桩件):

    “将对象替换为(可选地)返回配置好的返回值的测试替身的实践方法称为上桩(stubbing)”——这是官方文档给出的上桩解释

  也许这个形容有点抽象来着,大概的表达了这么个意思:比如说你有一个方法,依赖了数据库查询,当数据库一切正常时,这个单元测试是OK的,但是当数据库挂掉的时候,这个单测就会挂掉。这就不符合咱们 

单测的一些意义了,单测应该是纯净的,只验证你的逻辑这些,所以呢,我们就需要把这些mock掉,怎么mock呢?就是你可以自定义一个数据库的返回,比如刚才说的我需要数据库的某个字段返回1的时候,单测就能成功,

这时候我们不能完全依赖数据库,万一被别人改了怎么办?我就自己定义这个字段返回1;以后就算网络不通,这个字段在这里都会返回1,是一个定义死了数据,这样就等于把数据库查询给mock了

然后就可以开始愉悦了······················

在这个过程中我遇到了这些拦路虎:

1.如何mock

2.怎么把mock的对象传进去

解决方法呢?

1.用桩件mock 然后在指定返回(详情见代码呀)

2.可以给这个被测试的类构造一个public 属性的参数,再在construct里面实例化这个被mock的类,再将mock传入这个参数里面这个参数

    

====前提

    我想测试的是这样一个方法:switchClothes($username)  ----通过名字查询数据库,性别是1的,就返回裤子,是0的,就返回裙子;

<?php
Class Switch{ public $server;
       public function __construct() {

           $this->srv=new database();
           }

           public function switchClothes($username){ 
         $gender=$this->server->find("id=$username");
         if($gender==0){           return "裙子";
        }else{
  
         return "裤子";
        }
      }
    }  

    查询数据库我封装了一个Database类里面的: find()

====开始写测试

首先我需要测试的是switchClothes这个类,可是在这个类里我需要去通过实例化database这个类用select方法,查询数据库再来得到我到底是要裤子还是裙子。所以,,真的是太麻烦了,我只是单纯的想测测这个方法的逻辑好么,万一数据库挂了,万一这个username不存在,我难道还要专门去数据库创造这样一条数据么,太麻烦了也不够好。万一需要测试包含更新数据的方法,难道还要真的修改数据么?

stub就华丽丽降临了。妈妈再也不用担心我要去操作数据库,再也不担心接口不通神马的了。

    初识 PHPunit stub 模拟返回数据

    我可以对这个类进行上桩。说通俗点,我觉得就是对这个类进行了一个模拟,做了一个假的database类;

    如上如  A=switchClothes  B=database类  D=数据库   C=stub 的那个类

    本来应该是A调用B,B查询数据库的.

    但是C的存在就走了红色那条线,C不会去查数据库,C是被我掌控的,我可以指定里面的find()方法返回1或者0 至少在A看来它和B一样,反正会给我返回个0或者1来的。这就等于C 将A与B,D这个体系隔绝了开来,减少了耦合;

    然后,就可以开始构造我需要的C了。

    

<?php
use PHPUnit\Framework\TestCase; class StubTest extends TestCase
{ public function testStub()
{
// 为database类建立桩件。
$stub = $this->getMockBuilder("database")//类名
->setMethods(array('find')) //可以是多个方法
->getMock(); // 配置桩件。
$stub->method('find')//想要设置返回值的方法
->willReturn(0);//设置返回值
     $ser=new Switch();
     $ser->server=$stub; //将桩件赋值给server
     $ser->switchClother("1"); //调用被测试的方法
       // 现在调用将返回 '裙子'。

     $this->assertEquals('裙子', $stub->find()); } } ?>

这就是C了。

单测的时候,走红色那条路就行了。

all

   

    

   

    

  

  

  

上一篇:SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计


下一篇:vue+antd中的table实现全选