首頁 > php教程 > php手册 > 主體

初識 PHPunit stub 模擬返回數據

WBOY
發布: 2016-10-08 16:04:47
原創
1482 人瀏覽過

   這是這段時間以來結合 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

 

 

       

   

    

   

          

 

  

  

  

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板