我如何模拟应该接受数组的方法?

时间:2017-09-04 13:17:55

标签: php unit-testing testing phpunit shopware

我是使用PHPUnit进行测试的新手,我尝试做的是测试一个名为returnOnLogin()的方法,该方法接受参数Enlight_Event_EventArgs $args并返回true

以下是我要测试的方法:

public function returnOnLogin(\Enlight_Event_EventArgs $args)
{
    $controller = $args->get('subject');
    $view = $controller->View();

    $controller->redirect([
        'controller' => 'verification'
    ]);

    // $view->addTemplateDir(
    // __DIR__ . '/Views'
    // );

    return true;
}

这是我的测试:

class MyFirstTestPluginTest extends TestCase
{
    public function testReturnOnLogin()
    {
        $my_plugin = new MyFirstTestPlugin(true);
        $expected = true;

       //I tried following but it did not work
       $this->assertEquals($expected, $my_plugin->returnOnLogin(//here is the problem it requires this array that I dont know));
   }

}

1 个答案:

答案 0 :(得分:2)

假设你的控制器类是Controller,并假设我们不关心在view()中调用$controller,这应该涵盖你正在寻找的内容:

class MyFirstTestPluginTest extends TestCase
{
    public function testReturnOnLogin()
    {
        /**
         * create a test double for the controller (adjust to your controller class)
         */
        $controller = $this->createMock(Controller::class);

        /**
         * expect that a method redirect() is called with specific arguments
         */
        $controller
            ->expects($this->once())
            ->method('redirect')
            ->with($this->identicalTo([
                'controller' => 'verification'
            ]));

        /**
         * create a test double for the arguments passed to returnLogin()
         */
        $args = $this->createMock(\Enlight_Event_EventArgs::class);

        /** 
         * expect that a method subject() is invoked and return the controller from it
         */
        $args
            ->expects($this->once())
            ->method('subject')
            ->willReturn($controller);

        $plugin = new MyFirstTestPlugin(true);

        $this->assertTrue($plugin->returnOnLogin($args));
    }
}

这项测试的作用是什么?

安排

此测试首先安排测试双打,以便与被测系统(您的插件)一起使用。

第一个测试double是你的控制器,我们设置它的方式是我们期望一个方法redirect()被调用一次,其参数与指定的数组相同。

第二个测试double是参数,我们设置它的方式是我们期望一个方法'subject()`被调用一个,并将返回控制器。

然后,我们设置被测系统,只需创建MyFirstTestPlugin的实例,将true传递给构造函数。

不幸的是,您还没有与我们共享构造函数,我们不知道参数true代表什么。如果它影响returnLogin()的行为,那么当参数采用不同的值时,我们显然需要添加更多测试来断言行为。

然后,此测试在被测系统上调用方法returnLogin(),并传入其中一个测试双精度。

断言

最终,此测试断言方法returnLogin()返回true

注意看看