首页 >php教程 >php手册 >初识 PHPunit stub 模拟返回数据

初识 PHPunit stub 模拟返回数据

WBOY
WBOY原创
2016-10-08 16:04:471483浏览

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

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

 

  stub(桩件):

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

    现在倒回来看我才理解,怎么说呢?举个梨子。

====前提

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

          

<span style="color: #000000;">php
        </span><span style="color: #0000ff;">Class</span> <span style="color: #0000ff;">Switch</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> switchClothes(<span style="color: #800080;">$username</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$database</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> database();
                </span><span style="color: #800080;">$gender</span>=<span style="color: #800080;">$databse</span>->find("id=<span style="color: #800080;">$username</span>")<span style="color: #000000;">;
                </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$gender</span>==0<span style="color: #000000;">){
                        </span><span style="color: #0000ff;">return</span> "裙子"<span style="color: #000000;">;
                }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{
                        </span><span style="color: #0000ff;">return</span> "裤子"<span style="color: #000000;">;
                }
            }
        }</span>

 

    查询数据库我封装了一个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了。

    

<span style="color: #000000;">php
</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> PHPUnit\Framework\TestCase;

</span><span style="color: #0000ff;">class</span> StubTest <span style="color: #0000ff;">extends</span><span style="color: #000000;"> TestCase
{
    

    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> testStub()
    {
        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 为database类建立桩件。</span>
        <span style="color: #800080;">$stub</span> = <span style="color: #800080;">$this</span>->getMockBuilder("database"<span style="color: #000000;">)//类名
                             </span>->setMethods(<span style="color: #0000ff;">array</span>('find')) <span style="color: #008000;">//</span><span style="color: #008000;">可以是多个方法</span>
                              -><span style="color: #000000;">getMock();

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 配置桩件。</span>
        <span style="color: #800080;">$stub</span>->method('find'<span style="color: #000000;">)//想要设置返回值的方法
             </span>->willReturn(0<span style="color: #000000;">);//设置返回值 

        </span><span style="color: #008000;">//</span><span style="color: #008000;"> 现在调用 $stub->select() 将返回 '裙子'。</span>
        <span style="color: #800080;">$this</span>->assertEquals('裙子', <span style="color: #800080;">$stub</span>-><span style="color: #000000;">find());
    }
}
</span>?>                

 这就是C了。

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

 all

 

 

       

   

    

   

          

 

  

  

  

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn