您误解了模拟的工作原理。如果你使用依赖注入在你的类中设置一个辅助对象,那么你可以模拟你注入的对象。之后,您可以模拟原始对象的行为(界面)。更好的方法是模拟接口,因为您可以在不创建任何实现当前接口的类的情况下进行开发。
以你的例子:
interface UrlLoaderInterface {
public function load($url);
}
class YourParser {
protected $urlLoader;
protected $source;
public function setUrlLoader(UrlLoaderInterface $urlLoader) {
$this->urlLoader = $urlLoader;
}
public function fetchAndParse($url) {
$this->loadUrl($url);
$this->parse();
}
public function loadUrl($url) {
$this->source = $this->urlLoader->load($url);
}
public function parse() {
}
}
Mock::generate('UrlLoaderInterface', 'MockUrlLoader');
class TestYourParser extends UnitTestCase {
public function testShouldCallUrlLoaderByFetchAndParse() {
$testUrl = 'http://url';
$urlLoader = new MockUrlLoader();
$urlLoader->expectOnce('load', array($testUrl));
$urlLoader->returns('load', 'source', array($testUrl));
$parser = new YourParser();
$parser->setUrlLoader($urlLoader);
$parser->fetchAndParse($testUrl);
}
}
顺便提一句。你的例子是失败的,因为方法名称不能包含像'and','or','if'等词......一个方法只允许做一件事。如果您使用这些词,那么您可以确定您的代码设计不佳。