如何在 Laravel 中使用 Twilio REST 客户端对控制器进行功能测试?

问题描述

我正在向没有测试的遗留(继承)PHP/Laravel 7.x 应用程序添加测试覆盖率。

以下是我需要介绍的控制器的简化摘录:

// PhoneVerificationController.PHP

<?PHP

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use Twilio\Rest\Client;
use Vanguard\Http\Controllers\Api\ApiController;
// ...

class PhoneVerificationController extends ApiController {

    // ...

    private $twilio;

    public function __construct(UserRepository $users)
    {
        // ...
        $this->twilio = new Client(config('services.twilio.sid'),config('services.twilio.token'));
        // ...
    }

    public function sendVerifySms(Request $request)
    {
        // ...
            $lookup = $this->twilio->lookups->v1->phoneNumbers($telephone)->fetch([
                "addOns" => [
                    "twilio_carrier_info"
                ]
            ]);
        // ...
        // 
        return response()->json(['status' => 'OK']);
    }

    // ...
}

这是我要编写的测试的简化摘录:

// PhoneControllerTest.PHP

<?PHP

namespace Tests\Feature\Api;

use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\BuildsScenario;
use Tests\Feature\ApiTestCase;
use App\User;

class PhoneControllerTest extends ApiTestCase
{
    use DatabaseTransactions;
    use BuildsScenario;

    public function test_api_phone_send_sms()
    {
        $this->buildScenario();

        // Should I Mock the Twilio REST Client here?

        $response = $this->actingAs($this->client)
             ->json('POST','/api/verifications/phone/send');

        // Assertions
    }
}

此时我知道代码,就像现在一样,可能很难测试,所以重构它以使其可测试是可以接受的。

我不明白的是,可以将这种创建 REST 客户端实例的方式更改为使用依赖项容器:

    $this->twilio = new Client(config('services.twilio.sid'),config('services.twilio.token'));

    $this->twilio = resolve('twilio.client');

但即使这样,我也很难理解我是否应该嘲笑客户。即使我这样做了,我也不确定如何表达对 shouldReceive()

之类的调用$this->twilio->lookups->v1->phoneNumbers($telephone)->fetch(...) 期望

注意:我知道代码被简化了,其想法是提供对问题的关注并减少测试中无关代码的噪音。如果需要,我可以提供更多详细信息。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)