gpt4 book ai didi

php - 如何模拟对象属性?

转载 作者:可可西里 更新时间:2023-10-31 23:40:20 25 4
gpt4 key购买 nike

我正在尝试模拟属性,但无法让它工作。在这种情况下,我尝试模拟请求属性 Symfony\Component\HttpFoundation\Request

根据 this answer 我应该为 __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 mock ,但那个根本没有提到如何模拟属性。

根据另一个答案,我可以尝试以下操作:

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 已经加载。

最佳答案

不完全确定你的意思是模拟属性,我假设属性是通过 getter 和 setter 设置的,然后你可以用你想要的任何模拟来设置它们。

但是,如果您需要将模拟对象分配给您没有访问器方法的私有(private)/ protected 属性,您可以这样做:

$reflection = new \ReflectionClass($objectThatContainsThePropertyToMock);
$property = $reflection->getProperty($propertyName);
$property->setAccessible(true);
return $property->setValue($mockedObject);

关于php - 如何模拟对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com