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

PHPUnit Test result type or also the result variables

在单元测试期间,我总是对要测试的内容感到困惑。 我需要测试 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 returns 是否是 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);
        }
    }

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

如果您不编写测试并执行代码,您会寻找什么来确保代码按预期执行。您将检查返回对象中的值是否正确。我会通过使用对象的 public API 来验证值是否正确。

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

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

许多人将他们的测试限制在 public 方法上,并简单地确保 protected/private 方法的代码覆盖率足够。但是,请随意测试您认为值得测试的任何内容。一般来说,测试越多越好。

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

我依靠单元测试让我在未来进行代码更改,并且我对我的更改没有造成任何中断感到满意,只是 运行 测试。

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

这样,如果您以后不小心更改了响应字符串,您的测试会告诉您。