单元测试

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

单元测试

您可能已经注意到的一些微妙但重要的bug在前面的章节中,我们建立了框架。在创建一个框架时,你必须确保它作为广告的行为。如果不是,基于它的所有应用程序将表现出同样的错误。好消息是,每当你解欧宝平台是合法的吗决一个错误,你也修复很多应用程序。

今天的任务是编写单元测试的框架我们已经通过使用创建的PHPUnit)。创建一个PHPUnit)配置文件example.com/phpunit.xml.dist:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><phpunit)xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: noNamespaceSchemaLocation=“https://schema.phpunit.de/5.1/phpunit.xsd”backupGlobals=“假”颜色=“真正的”引导=“供应商/ autoload.php”><testsuite文件><testsuite的名字=“测试套件”><目录>。/测试< /目录>< /testsuite>< /testsuite文件><过滤器><白名单processUncoveredFilesFromWhitelist=“真正的”><目录后缀=“。php”>. / src< /目录>< /白名单>< /过滤器>< /phpunit)>

这个配置定义了大多数PHPUnit)设置合理的默认值;更有趣的是,自动装卸机是用来引导测试,测试将存储在example.com/tests/目录中。

现在,让我们来编写一个测试“找不到”的资源。为了避免创建所有依赖项时编写测试,只是我们想要做单元测试,我们将使用测试双打。测试双打更容易创建当我们依赖接口,而不是具体的类。幸运的是,Symfony提ob娱乐下载供这样的接口为核心对象URL匹配器和控制器解析器。修改框架使用:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
/ / example.com/src/Simplex/Framework.php名称空间单纯形;/ /……使用日历\控制器\LeapYearController;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentResolverInterface;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolverInterface;使用ob娱乐下载\组件\路由\匹配器\UrlMatcherInterface;框架{受保护的美元匹配器;受保护的美元controllerResolver;受保护的美元argumentResolver;公共函数__construct(UrlMatcherInterface美元匹配器,ControllerResolverInterface美元解析器,ArgumentResolverInterface美元argumentResolver){美元- >匹配器=美元匹配器;美元- >controllerResolver =美元解析器;美元- >argumentResolver =美元argumentResolver;}/ /……}

现在我们已经准备好写我们的第一个测试:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
/ / example.com/tests/Simplex/Tests/FrameworkTest.php名称空间单纯形\测试;使用PHPUnit)\框架\TestCase;使用单纯形\框架;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentResolverInterface;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolverInterface;使用ob娱乐下载\组件\路由;使用ob娱乐下载\组件\路由\异常\ResourceNotFoundException;FrameworkTest扩展TestCase{公共函数testNotFoundHandling(){美元框架=美元- >getFrameworkForException (ResourceNotFoundException ());美元响应=美元框架- >处理(请求());美元- >assertequal (404年,美元响应- >getStatusCode ());}私人函数getFrameworkForException(美元异常){美元匹配器=美元- >createMock(路由\匹配器\ UrlMatcherInterface::类);/ /使用getMock PHPUnit) 5.3或以下()/ / $匹配器= $ this - > getMock(路由\匹配器\ UrlMatcherInterface::类);美元匹配器- >预计(美元- >一旦())- >方法(“匹配”)- >将(美元- >throwException (美元异常));美元匹配器- >预计(美元- >一旦())- >方法(“getContext”)- >将(美元- >returnValue (美元- >createMock(路由\ RequestContext::类)));美元controllerResolver=美元- >createMock (ControllerResolverInterface::类);美元argumentResolver=美元- >createMock (ArgumentResolverInterface::类);返回框架(美元匹配器,美元controllerResolver,美元argumentResolver);}}

这个测试模拟了一个要求不匹配任何路线。因此,匹配()方法返回一个ResourceNotFoundException例外,我们正在测试我们的框架将这个异常转换为404响应。

执行这个测试运行phpunit)example.com目录:

1
美元/供应商/ bin / phpunit)

请注意

如果你不理解到底是怎么回事在代码中,阅读PHPUnit)文档欧宝官网下载app测试双打

测试运行后,您应该看到一个绿色的酒吧。如果不是,你有一个错误在测试或框架代码!

添加一个控制器中抛出的任何异常的单元测试:

1 2 3 4 5 6 7 8
公共函数testErrorHandling(){美元框架=美元- >getFrameworkForException (\ RuntimeException ());美元响应=美元框架- >处理(请求());美元- >assertequal (500年,美元响应- >getStatusCode ());}

最后但不是最少,让我们写一个测试当我们实际上有一个适当的回应:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35
使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentResolver;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolver;/ /……公共函数testControllerResponse(){美元匹配器=美元- >createMock(路由\匹配器\ UrlMatcherInterface::类);/ /使用getMock PHPUnit) 5.3或以下()/ / $匹配器= $ this - > getMock(路由\匹配器\ UrlMatcherInterface::类);美元匹配器- >预计(美元- >一旦())- >方法(“匹配”)- >将(美元- >returnValue ([“_route”= >“is_leap_year /{一}”,“年”= >“2000”,“_controller”= > [LeapYearController (),“指数”]]));美元匹配器- >预计(美元- >一旦())- >方法(“getContext”)- >将(美元- >returnValue (美元- >createMock(路由\ RequestContext::类)));美元controllerResolver=ControllerResolver ();美元argumentResolver=ArgumentResolver ();美元框架=框架(美元匹配器,美元controllerResolver,美元argumentResolver);美元响应=美元框架- >处理(请求());美元- >assertequal (200年,美元响应- >getStatusCode ());美元- >assertStringContainsString (“是的,这是一个闰年!”,美元响应- >getContent ());}

在这个测试中,我们模拟一个路线相匹配,并返回一个简单的控制器。我们检查响应状态是200,它的内容是我们的一个控制器。

检查我们已经介绍了所有可能的用例,运行PHPUnit)测试覆盖特性(您需要启用XDebug第一个):

1
美元。/供应商/ bin / phpunit)——coverage-html = x /

开放example.com/cov/src/Simplex/Framework.php.html在浏览器框架类和检查所有的线是绿色的(这意味着他们已经参观了测试执行时)。

或者你可以直接向控制台输出结果:

1
美元/供应商/ bin / phpunit)——coverage-text

多亏了干净的面向对象的代码,我们写了到目前为止,我们已经能够编写单元测试的覆盖所有可能的用例框架;测试双打确保我们测试我们的代码而不是Symfony的代码。ob娱乐下载

现在,我们有信心对我们写的代码(再一次),我们可以安全地考虑功能的下一批我们想要增加我们的框架。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。