PHP 单元测试 - 如何伪造供应商 Guzzle 请求
PHP unit test - How to fake a vendor Guzzle request
我正在尝试在 PHP 上进行一项涉及 2 项服务的测试。
我的服务 'A' 的内部逻辑需要向服务“B”发送消息。我没有配置 B,所以它总是会在测试环境中以错误响应,但是,我不需要知道 'B' 做了什么,我只需要知道 'B' 给出了一个200 响应,服务 'A' 上的回调在我的数据库中保存了一些数据。
服务之间的通信由在后台使用 Guzzle 的私有供应商包处理。我发现的问题是,如果不接触供应商的源代码,我似乎无法使用 Guzzle Mock 或 STack,对吗?
那么,最好的解决方案是创建一个假的 api,它总是在与真实“B”服务相同的 ip:port 上响应我的请求 200 吗?
谢谢!
不知道我理解的对不对,但是应该很容易解决这个问题。
从服务 B 创建存根 class 并配置服务 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'));
我正在尝试在 PHP 上进行一项涉及 2 项服务的测试。
我的服务 'A' 的内部逻辑需要向服务“B”发送消息。我没有配置 B,所以它总是会在测试环境中以错误响应,但是,我不需要知道 'B' 做了什么,我只需要知道 'B' 给出了一个200 响应,服务 'A' 上的回调在我的数据库中保存了一些数据。
服务之间的通信由在后台使用 Guzzle 的私有供应商包处理。我发现的问题是,如果不接触供应商的源代码,我似乎无法使用 Guzzle Mock 或 STack,对吗?
那么,最好的解决方案是创建一个假的 api,它总是在与真实“B”服务相同的 ip:port 上响应我的请求 200 吗?
谢谢!
不知道我理解的对不对,但是应该很容易解决这个问题。
从服务 B 创建存根 class 并配置服务 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'));