单元测试
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
单元测试
您可能已经注意到的一些微妙但重要的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/9.3/phpunit.xsd”backupGlobals=“假”颜色=“真正的”引导=“供应商/ autoload.php”><报道processUncoveredFiles=“真正的”><包括><目录后缀=“。php”>. / src< /目录>< /包括>< /报道><testsuite文件><testsuite的名字=“测试套件”><目录>。/测试< /目录>< /testsuite>< /testsuite文件>< /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娱乐下载
现在,我们有信心对我们写的代码(再一次),我们可以安全地考虑功能的下一批我们想要增加我们的框架。