【问题标题】:PHP unit test - How to fake a vendor Guzzle requestPHP 单元测试 - 如何伪造供应商 Guzzle 请求
【发布时间】:2020-10-01 05:23:30
【问题描述】:

我正在尝试在 PHP 上进行涉及 2 个服务的测试。

我的服务“A”的内部逻辑需要向服务“B”发送消息。我没有配置 B,所以它总是会在测试环境中响应错误,但是,我不需要知道“B”做了什么,我只需要知道“B”给出 200 响应后,服务“A”上的回调将一些数据保存在我的数据库中。

服务之间的通信由在后台使用 Guzzle 的私有供应商包处理。我发现的问题是,如果不接触供应商的源代码,我似乎无法使用 Guzzle Mock 或 STack 吗?

那么,最好的解决方案是创建一个始终响应 200 对我在真实“B”服务的同一 ip:port 上的请求的虚假 api 吗??

谢谢!

【问题讨论】:

  • 也许可以扩展“使用 Guzzle Mock 或 STack 而不接触供应商的源代码”。不确定我是否关注。

标签: php web-services testing automated-tests guzzle


【解决方案1】:

我不知道我是否理解你,但应该很容易解决这个问题。

从服务 B 类创建一个存根,并配置服务 A 调用的方法:

$serviceBStub = $this->createStub(ServiceB::class);
$serviceBStub->method('yourRequest')->willReturn(200);

在服务 A 上调用该方法后,您可以在数据库中检查结果:

$this->assertEquals('foo', $db->find(1)->getTitle());

或者您可以使用模拟:

$dbMock = $this->createMock(Db::class);
$dbMock->expects($this->once())
                 ->method('create')
                 ->with($this->equalTo('something'));

来源:https://phpunit.readthedocs.io/en/9.3/test-doubles.html

【讨论】:

  • 我决定使用模拟。我遇到了麻烦,因为服务 A 正在创建它自己的服务 B 实例而不是接收参数,所以我无法应用模拟。我正在重写一些位来支持它。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2012-08-14
  • 2021-09-20
相关资源
最近更新 更多