模拟SimpleXML HTML调用

时间:2014-01-27 00:04:10

标签: mocking phpunit simplexml

我正在编写一个包含从api加载详细信息的包。我正在为它编写测试,但我并不完全确定这样做的最佳方法。由于测试api将涉及向网站提出请求,我想避免它(特别是因为问题的api不是世界上最快的),如果可以的话。

测试我从页面加载xml并将其转换为我想要的对象的最佳方法是什么,而不是实际加载该页面?

2 个答案:

答案 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类型,只需要测试一两种。