问题描述
我正在向没有测试的遗留(继承)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 (将#修改为@)