首页 / PHP / PhpUnit模拟:函数未定义
PhpUnit模拟:函数未定义
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PhpUnit模拟:函数未定义,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1926字,纯文字阅读大概需要3分钟。
内容图文
我正在为我的助手编写一些测试.这是我第一次想用嘲弄对象做些什么.我正在使用默认的PHPUnit模拟框架.
我编写了一个函数来准备我的模拟对象:
private function getTestStub(){
$mockResult = array();
$mock = $this->getMock('My\Entity\Product');
$mock->expects($this->once())
->method('getId')
->will($this->returnValue(1));
$mock->expects($this->once())
->method('getName')
->will($this->returnValue('jan'));
$mock->expects($this->once())
->method('getWoonplaats')
->will($this->returnValue('Amsterdam'));
$mockResult[] = $mock;
return $mockResult;
}
现在,当我的测试使用此存根时,我收到以下错误:
Fatal error: Call to undefined method Mock_Product_129abca6::getId()
我在这做错了什么?
解决方法:
PHPUnit会查看您尝试通过reflection或get_class_methods模拟的类.
您模拟的类(如果存在)由模拟对象扩展.类似地,实现了接口.您可以在代码本身中使用see how this works.这是一堆代码生成的东西,如果你想看一看并跟踪它是如何工作的,一个好的起点是PHPUnit_Framework_MockObject_Generator :: generate.
如果没有看到你正在尝试模拟的类,我会猜测你的getter是由__call生成的“神奇”方法,具体如下:
<?php
namespace My\Entity;
class Product
{
private $data = array();
public function __call($method, $args)
{
$set_or_get = strtolower(substr($method, 0, 3));
$prop = strtolower(substr($method, 3));
if ('get' === $set_or_get) {
return isset($this->data[$prop]) ? $this->data[$prop] : null;
} elseif ('set' === $set_or_get && isset($args[0])) {
$this->data[$prop] = $args[0];
} else {
throw new \BadMethodCallException();
}
}
}
PHPUnit不能真正做你想要的,因为你试图调用的方法实际上并不存在,并且魔法__call不能按预期工作.要么是因为PHPUnit本身就使用了那个方法(你必须深入研究它).要解决这个问题,你需要tell PHPUnit which methods you want to include in your mock.
// the second argument let's you define methods
$mock = $this->getMock('My\Entity\Product');
// try doing this instead
$mock = $this->getMock('My\Entity\Product', array('getId', 'getName', 'getWoonplaats'));
This question也有上述和解决方法的一些很好的例子.
内容总结
以上是互联网集市为您收集整理的PhpUnit模拟:函数未定义全部内容,希望文章能够帮你解决PhpUnit模拟:函数未定义所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。