我正在使用Phactory和PHPUnit为 PHP Propel项目设置测试套件。我目前正在尝试对发出外部请求的函数进行单元测试,并且我想在该请求的模拟响应中存根。
这是我要测试的类的片段:
class Endpoint {
...
public function parseThirdPartyResponse() {
$response = $this->fetchUrl("www.example.com/api.xml");
// do stuff and return
...
}
public function fetchUrl($url) {
return file_get_contents($url);
}
...
这是我正在尝试编写的测试函数。
// my factory, defined in a seperate file
Phactory::define('endpoint', array('identifier' => 'endpoint_$n');
// a test case in my endpoint_test file
public function testParseThirdPartyResponse() {
$phEndpoint = Phactory::create('endpoint', $options);
$endpoint = new EndpointQuery()::create()->findPK($phEndpoint->id);
$stub = $this->getMock('Endpoint');
$xml = "...<target>test_target</target>..."; // sample response from third party api
$stub->expects($this->any())
->method('fetchUrl')
->will($this->returnValue($xml));
$result = $endpoint->parseThirdPartyResponse();
$this->assertEquals('test_target', $result);
}
我现在可以看到,在我尝试了我的测试代码之后,我正在创建一个模拟对象getMock
,然后从不使用它。所以该函数fetchUrl
实际上执行了,这是我不想要的。但我仍然希望能够使用 Phactory 创建的endpoint
对象,因为它具有从我的工厂定义中填充的所有正确字段。
有没有办法让我在现有对象上存根方法?所以我可以存根
刚刚创建fetch_url
的$endpoint
Endpoint 对象吗?
还是我做错了?有没有更好的方法来对依赖于外部 Web 请求的函数进行单元测试?
我确实阅读了有关“存根和模拟 Web 服务”的 PHPUnit 文档,但是他们这样做的示例代码有 40 行长,不包括必须定义自己的 wsdl。我很难相信这是我处理这个问题的最方便的方法,除非 SO 的好人强烈反对。
非常感谢任何帮助,我整天都在挂断电话。谢谢!!