【发布时间】:2018-08-03 06:47:29
【问题描述】:
我正在测试这个类,它在更深的地方使用 Redis:
<?php
class Publisher {
function publish($message) {
Redis::publish($message);
}
}
class Foo {
public function publishMessage() {
$message = $this->generateMessage();
$this->publish($message);
}
private function publish($message) {
$this->getPublisher()->publish($message);
}
// below just for testing
private $publisher;
public function getPublisher() {
if(empty($this->publisher) {
return new Publisher();
}
return $this->publisher;
}
public function setPublisher($publisher) {
$this->publisher = $publisher;
}
}
现在我不知道如何测试这个。当然我不想测试 Redis。我真正需要测试的是发送到 Redis 的消息是否是我所期望的。 (我想) 我可以编写一个函数来返回消息并且是公开的。但我不喜欢这个主意。 在此示例中,我可以设置发布者,因此在测试时我可以返回另一个 Publisher 类。 它不会发送消息,而是将其保存在内部,以便我以后可以断言它。
class Publisher {
public $message;
function publish($message) {
$this->message = $message;
}
}
但是我不知道如何模拟 Publisher 类来更改方法。或者我必须从 Publisher 类继承。 同样,我测试的类必须包含仅用于测试的代码。我也不喜欢。
我该如何正确测试呢? 存在 Redis 的模拟库,但不支持发布。
【问题讨论】:
-
我没有得到答案,但你忘记分配 $message: class Publisher { public $message;函数发布($message){ $this->message = $message; } }
-
感谢您的关注。
标签: php unit-testing redis mocking phpunit