PHPUnit - Setter不会修改我的模拟

时间:2016-03-07 16:25:40

标签: unit-testing symfony mocking phpunit

我使用PHPUnit进行单元测试(Symfony2 app)。

这是我想要测试的方法(简化):

public function __construct(Email $email)
{
    $this->email = $email;
}
public function sendEmail()
{
    // Here, more logic and condition, it's simplified
    if ($this->email->getOk() === 1) {
        $this->email->setSendEmail(1);
    }

    return $this->email;
}

我的测试:

$emailMock = $this->getMock(Email::class);
$emailMock->method('getOk')->will($this->returnValue(1));
$emailMock->method('setSendEmail')->will($this->returnArgument(0));

$email = new Email($emailMock);
$emailModified = $email->sendEmail();
var_dump($emailModified->getSendEmail()); // Returns NULL

我的班级电子邮件是一个学说实体(设置者和获取者在里面)(an example of entity)

如何测试我的模拟是否被我的课程补充? 我想通过查看我的物体是否含水来知道我的方法是否有效。

修改

我尝试了另一种方法:

   $object = $this->getMock(MyClass::class);
   $object->method('setPosition')->will(
            $this->returnCallback(
                $pos = function ($arg) {
                    return $arg;
                }
            )
        );

   $object->method('getPosition')->will($this->returnValue($pos));


    $method = new \ReflectionMethod(MyClass::class, 'testMethod');
    $method->setAccessible(true);
    $res = $method->invoke(new MyClass($object));

   var_dump($res->getPosition()) // Return inexploitable Closure

当我从我测试的外部类MyClass()执行$object->getPosition()时,我希望1返回$object->setPosition(1)

1 个答案:

答案 0 :(得分:0)

最新答案,但我最终嘲笑了gettersetter这样的功能

    // Mock setter
    $exceptionEvent->expects($this->once())->method('setResponse')->willReturnCallback(
        function($arg) use ($exceptionEvent) {
            $exceptionEvent->response = $arg;
        }
    );
    // Mock getter
    $exceptionEvent->expects($this->once())->method('getResponse')->willReturnCallback(
        function() use ($exceptionEvent) {
            return $exceptionEvent->response;
        }
    );

我正在测试的课程接受$exceptionEvent并在其上调用setResponse()。此解决方案对我有用,然后在通过上述类运行$exceptionEvent->getResponse()之后对它进行声明。