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