【发布时间】:2014-07-26 06:07:11
【问题描述】:
我正在尝试模拟属性,但无法使其正常工作。在这种情况下,我试图模拟请求属性Symfony\Component\HttpFoundation\Request。
根据this 的回答,我应该为__get 返回一个值
以下代码一直显示NULL:
$testRequest = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
->disableOriginalConstructor()
->getMock();
$testRequest->expects($this->any())
->method('__get')
->with($this->equalTo('request'))
->will($this->returnValue("working"));
var_dump($testRequest->request);
也许是因为答案太旧了,所以查看了模拟的current documentation,但根本没有提到如何模拟属性。
根据另一个答案,我可以尝试以下方法:
private $post=array('search'=>'abc','start'=>null);
...
$paramBag = $this->getMockBuilder('Symfony\Component\HttpFoundation\ParameterBag')
->disableOriginalConstructor()
->getMock();
foreach($this->post as $key=>$value){
echo "setting:".$key.' with:'.$value.PHP_EOL;
$paramBag->expects($this->any())
->method('get')
->with($this->equalTo($key))
->will($this->returnValue($value));
}
$this->request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
->disableOriginalConstructor()
->getMock();
$this->request->request=$paramBag;
echo ($this->request->request->get('start'));
这给了我:
Expectation failed for method name is equal to <string:get> when invoked zero or more times
Parameter 0 for invocation Symfony\Component\HttpFoundation\ParameterBag::get('search', null, false) does not match expected value.
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'search'
+'start'
不能用不同的值覆盖多个方法吗?同样,文档完全没有任何例子。
如果我尝试echo ($this->request->request->get('start'));,它将在期待搜索但开始时失败。我不可能给它一些不会失败的东西。
尝试进行单元测试,但 Symfony2 似乎没有这样的东西。每个documentation 几乎都会立即跳过单元测试,其中包含不需要依赖的普通类的示例,然后转向功能测试。一些文档直截了当地说unit testing for repositories is not recommended。
我想看看是否正确创建了 DQL 语句,但我没有记录选项来对此进行单元测试。
可以通过创建一个假的Doctrine\ORM\EntityRepository 类来完成这部分,并在我的测试开始时包含该文件。对Symfony\Component\HttpFoundation\Request 进行了同样的尝试,但在尝试这样做时得到了can't re define this class。不知何故,当我的测试加载时 Symfony\Component\HttpFoundation\Request 已经加载了。
【问题讨论】:
标签: php unit-testing symfony mocking phpunit