PHPUnit测试结果类型或结果变量

时间:2015-07-21 19:55:59

标签: php unit-testing phpunit

在单元测试期间,我总是对测试内容感到困惑。 我是否需要测试API,只测试API或方法结果值。

class SomeEventHandler
    {
        public function onDispatch (Event $event)
        {
            if ($event->hasFoo)
            {
                $model = $this->createResponseModel('foo');
            }
            else
            {
                $model = $this->createResponseModel('bar');
            }

            // End.
            return $model;
        }

        private function createResponseModel ($foo)
        {
            $vars = array(
                'someVare' => true,
                'foo'      => $foo
            );

            // End.
            return new ResponseModel($vars);
        }
    }

我应该测试方法onDispatch是否返回ResponseModel的实例,还是应该测试变量foo是否设置正确?

或者下面的测试是否合适?

    class SomeEventHandlerTest
    {
        // assume that a instance of SomeEventHandler is created
        private $someEventHandler;

        public function testOnDispatch_EventHasFoo_ReturnsResponseModel ()
        {
            $e         = new Event();
            $e->hasFoo = true;

            $result = $someEventHandler->onDispatch($e);

            $this->assertInstanceOf('ResponseModel', $result);
        }

        public function testOnDispatch_EventHasNoFoo_ReturnsResponseModel ()
        {
            $e         = new Event();
            $e->hasFoo = false;

            $result = $someEventHandler->onDispatch($e);

            $this->assertInstanceOf('ResponseModel', $result);
        }
    }

3 个答案:

答案 0 :(得分:1)

如果你手动检查代码,你会检查什么?只是返回了一个ResponseModel,或者它还有正确的值?

如果您没有编写测试并执行代码,那么您需要什么来确保代码正在执行它应该执行的操作。您将检查返回的对象中的值是否正确。我会通过使用对象的公共API来验证值是否正确。

一个想法是进行测试,如果代码被删除,您将能够通过仅进行测试来重新创建所有功能。只检查返回的对象可能会产生一个只有return new ResponseModel();的函数。这将通过测试但不是你想要的。

答案 1 :(得分:1)

简而言之,您决定测试的是主观的,但您应该至少测试所有公共方法。

许多人将测试限制为公共方法,只需确保受保护/私有方法的代码覆盖率足够。但是,您可以随意测试您认为值得测试的任何内容。一般来说,越多的测试越好。

答案 2 :(得分:1)

在我看来,您当然应该测试您的响应数据,而不仅仅是返回类型。

我依靠单元测试让我在将来进行代码更改,并且只需运行测试就可以确保我的更改没有创建任何中断。

所以在你的情况下,如果" foo"或" bar"响应数据很重要,你应该测试一下。

如果你以后偶然更改了响应字符串,那么你的测试会告诉你。