【问题标题】:How to mock object properties?如何模拟对象属性?
【发布时间】: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-&gt;request-&gt;request-&gt;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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-18
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多