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

初识 PHPunit stub 模拟返回数据

WBOY
WBOYOriginal
2016-10-08 16:04:471488Durchsuche

   这是这段时间以来结合 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

 

 

       

   

    

   

          

 

  

  

  

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Windows下安装Nginx+php+mysql环境Nächster Artikel:IDE有毒