Drupal 8 PHPUnit 测试无效凭证
Drupal 8 PHPUnit testing Invalid Credentials
我有一个 class 我想测试它使用这个 module PHP Emarsys 网络服务的 HTTP 客户端,但是当我尝试测试它时,我总是会得到 $response
作为模块本身的“凭据无效”。
这是我的代码片段:(鉴于我能够为测试 Class 正确创建 setUp()
因为我能够将它用于其他测试)
Test.php
Class TestClass extends UnitTestCase {
public function testCreateWithValidEmail() {
$newsletter = new Newsletter();
$form = new FormState();
$form->setValue('email', 'abc@def.ghi');
$response = $newsletter->register($form);
// Assertion here
}
}
Class.php
use Snowcap\Emarsys\CurlClient;
use Snowcap\Emarsys\Client;
Class Newsletter {
public function register(FormStateInterface $state){
$emailData = $state->getValue('email');
$httpClient = new CurlClient();
$client = new Client($httpClient, $api_username, $api_secret);
$someData = [
"3" => $emailData, // since 3 is the index ID for email
// ...more data here
];
$response = $client->createContact($someData);
}
}
我是否必须在这里创建一个模拟来传递虚拟 api 和秘密然后强制来自 createContact
的有效响应?
你的方向不错。但是 Newsletter
class 需要 $httpClient
注入。
所以你将能够做到:
$client = $this->getMockBuilder(Snowcap\Emarsys\CurlClient::class)
->disableOriginalConstructor()
->getMock();
$response = $this->getMockBuilder(ResponseInterface::class)
->disableOriginalConstructor()
->getMock();
$response->expects($this->any())
->method('getStatusCode')
->willReturn(Response::HTTP_OK);
$client->expects($this->any())
->method('createContact')
->with($someData)
->will($this->returnValue($response));
$newsletter = new Newsletter($client);
$response = $newsletter->register($form);
// Assertion here
我有一个 class 我想测试它使用这个 module PHP Emarsys 网络服务的 HTTP 客户端,但是当我尝试测试它时,我总是会得到 $response
作为模块本身的“凭据无效”。
这是我的代码片段:(鉴于我能够为测试 Class 正确创建 setUp()
因为我能够将它用于其他测试)
Test.php
Class TestClass extends UnitTestCase {
public function testCreateWithValidEmail() {
$newsletter = new Newsletter();
$form = new FormState();
$form->setValue('email', 'abc@def.ghi');
$response = $newsletter->register($form);
// Assertion here
}
}
Class.php
use Snowcap\Emarsys\CurlClient;
use Snowcap\Emarsys\Client;
Class Newsletter {
public function register(FormStateInterface $state){
$emailData = $state->getValue('email');
$httpClient = new CurlClient();
$client = new Client($httpClient, $api_username, $api_secret);
$someData = [
"3" => $emailData, // since 3 is the index ID for email
// ...more data here
];
$response = $client->createContact($someData);
}
}
我是否必须在这里创建一个模拟来传递虚拟 api 和秘密然后强制来自 createContact
的有效响应?
你的方向不错。但是 Newsletter
class 需要 $httpClient
注入。
所以你将能够做到:
$client = $this->getMockBuilder(Snowcap\Emarsys\CurlClient::class)
->disableOriginalConstructor()
->getMock();
$response = $this->getMockBuilder(ResponseInterface::class)
->disableOriginalConstructor()
->getMock();
$response->expects($this->any())
->method('getStatusCode')
->willReturn(Response::HTTP_OK);
$client->expects($this->any())
->method('createContact')
->with($someData)
->will($this->returnValue($response));
$newsletter = new Newsletter($client);
$response = $newsletter->register($form);
// Assertion here