我正在编写一个包含从api加载详细信息的包。我正在为它编写测试,但我并不完全确定这样做的最佳方法。由于测试api将涉及向网站提出请求,我想避免它(特别是因为问题的api不是世界上最快的),如果可以的话。
测试我从页面加载xml并将其转换为我想要的对象的最佳方法是什么,而不是实际加载该页面?
答案 0 :(得分:3)
我最终解决它的方式是脑波,我意识到自己是个白痴
我们可以编写一个执行以下操作的类:
class XMLReader {
function parse($url) {
return simplexml_load_file($url)
}
}
然后我们可以将这个类注入api类
class Api {
protected xmlreader;
public function __construct(XMLReader $xmlreader) {
$this->xmlreader = $xmlreader;
}
public function apiCall($params) {
$url = getUrlFromParams($params);
$apiAnswer = $this->xmlreader->parse($url);
}
}
现在我们可以模拟一个XMLReader类,并告诉它解析本地文件而不是在线文件。
$mock = Mockery::mock('XMLReader');
$mock->shouldReceive('parse')->with('http://www.boardgamegeek.com/xmlapi/boardgame/13291?versions=1')->andReturn(simplexml_load_file('tests/13291.xml'))->once();
$api = new Api($mock);
$game = $api->getBoardGame($this->gameID);
答案 1 :(得分:0)
您应该单独测试XML处理和网络请求。
为了测试XML解析,手动获取一些示例XML,将它们保存在磁盘上,并将它们用作fixture。解析类应该将XML字符串作为输入,并应输出所需的对象。因此,在您的测试中,不是调用API来获取XML,而是从磁盘加载它并注入它以查看生成的对象是否是预期的。这样,您甚至可以模拟错误的XML或任何您想要的内容。
对于请求,只需测试您是否正在调用curl或正在使用的用于使用API的库。
然后,您还可以编写一些集成测试,这将完成整个过程,只是为了确保过程正确链接。但问题是这些集成测试不需要测试所有XML类型,只需要测试一两种。