iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Modern Web

當拉拉肉遇到單元測試,是否能夠擦出命運的火花?系列 第 15

[Day 14] 簡單的單元測試實作(八)-修改成API來呼叫

  • 分享至 

  • xImage
  •  

其實我們這樣子寫的方式,
感覺有點像在呼叫API,
所以我們決定要把它改成放到API,
我們把原本在web.php的內容刪掉,
然後新增一個APIController
php artisan make:controller API/APIController
https://ithelp.ithome.com.tw/upload/images/20210915/20105694o0cblmp87Y.png

檔案內容如下:

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;

class APIController extends Controller
{
    //
}

然後我們在routes/api.php新增

Route::post('/getLeapYear/{year}', 'Api\APIController@checkLeapYear');

這種呼叫方式是傳統的方式,
但是Laravel 8不能直接這樣子用,
通常是建議用以下的方式

use App\Http\Controllers\API\APIController;
Route::post('/getLeapYear/{year}', [APIController::class, 'checkLeapYear']);

關鍵在於這個檔案
app/Providers/RouteServiceProvider.php
裡面的第29行被註解掉了

// protected $namespace = 'App\\Http\\Controllers';

把這行註解拿掉就可以使用舊的方式來呼叫了,
不過比較不傾向用這種方式,
所以我們之後都使用呼叫class的方式來寫.

然後我們在APIController.php裡面加入函式去呼叫GetLeapYear這個函式

function checkLeapYear($year)
{
    $leap = GetLeapYear($year);
    if($leap)
        return "閏年";
    return "平年";
}

我們的測試程式也要改一下MyFirstUnitTest.php

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class MyFirstUnitTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

    public function test_leapyear_return_200()
    {
        $response = $this->post('api/getLeapYear/0');

        $response->assertStatus(200);
    }

    /**
     * @param $input
     * @param $output
     * @dataProvider input_number
     */
    public function test_leapyear_check_year($input, $output)
    {
        $response = $this->post("api/getLeapYear/$input");
        $this->assertSame($output, $response->getContent());
    }

    public function input_number()
    {
        return [
            ['4', '閏年'],
            ['2020', '閏年'],
            ['1900', '平年'],
            ['2100', '平年'],
            ['2000', '閏年'],
            ['1600', '閏年'],
            ['2021', '平年'],
            ['2023', '平年'],
        ];
    }
}

然後我們執行測試程式
php vendor/phpunit/phpunit/phpunit tests/Feature/MyFirstUnitTest.php
https://ithelp.ithome.com.tw/upload/images/20210915/20105694ZKyfhjFFE8.png

可以成功通過測資了。


上一篇
[Day 13] 簡單的單元測試實作(七)-建立共用的函式
下一篇
[Day 15] 針對網頁的單元測試(一)
系列文
當拉拉肉遇到單元測試,是否能夠擦出命運的火花?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言