php - 如何模拟对象属性?

标签 php unit-testing symfony mocking phpunit

我正在尝试模拟属性,但无法让它工作。在这种情况下,我尝试模拟请求属性 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/

相关文章:

javascript - 使用 HTML5 上传图像并在用户端降低质量

java - Jmockit:模拟@EJB

android - 如何测试对 setContentView 的调用?

php - 全新安装 symfony 时出错

从 crond 启动时出现 PHP 段错误

php - 将帐户信息更新到数据库不起作用,PHP 错误 : "Call to a member function"

symfony - 在不知道键值的情况下迭代数组内容

php - 在 swifmailer 中发送邮件时调用非对象上的成员函数 has()

php - 如果多个复选框在 php 中是动态的,如何存储它们

unit-testing - 我可以使用 Xcode Test Navigator 进行 EarlGrey 测试吗?