初识 PHPunit stub 模拟返回数据

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

   咱们通常使用单测对公司业务里的代码进行测试,他会帮忙找到你的一个个小小的思考不够全面的地方。(虽然大牛说过开发能够先写单测再来写实现的代码,然而如今的我感受离那个仍是有好多距离来着)数据库

 

  stub(桩件):网络

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

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

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

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

  而后就能够开始愉悦了······················this

   

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

1.如何mockcode

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就华丽丽降临了。妈妈不再用担忧我要去操做数据库,不再担忧接口不通神马的了。

    

    我能够对这个类进行上桩。说通俗点,我以为就是对这个类进行了一个模拟,作了一个假的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

相关文章
相关标签/搜索