Laravel用PhpSpec测试

PhpSpec是一个基于使用规范的紧急设计概念的测试工具。您可能听说过行为驱动开发(Behavior-Driven Development,BDD),PhpSpec是在spec级别或SpecBDD上使用的工具。我们在最近的Laravel测试资源综述中也提到了PhpSpec,其中包括如果您对尝试SpecBDD感兴趣,可以将PhpSpec合并到您的Laravel工作流中的方法。 如果您\"从未尝试过PhpSpec,我喜欢PhpSpec的一点是,该过程为您生成代码并指导您完成通过命令行执行SpecBDD进程。让我用一个快速教程来向您展示我的意思。入门 如果您想继续学习,请确保您已经安装了Composer,并且在您的路径中。我们要做的第一件事是创建一个新项目。当我修补库时,我喜欢在一个名为\"Sandbox\"的文件夹中创建一个项目: 1$ mkdir -p ~/Code/sandbox/calculator-phpspec && cd $_2$ mkdir src/34$ composer init5$ composer require --dev phpspec/phpspec 接下来,让我们在项目中添加一个PSR-4名称空间编写器.json文件,最后,你的文件看起来像这样: 1{ 2\"name\": \"predmond/calculator-phpspec\", 3\"require\": {}, 4\"require-dev\": { 5\"phpspec/phpspec\": \"^4.0\" 6}, 7\"autoload\": { 8\"psr-4\": { 9\"PredmondCalculator\": \"src/\"10}11}12} 在我们忘记之前,让我们转储autoloader,以便以后可以使用我们的命名空间: 1$ composer dump-autoload2Generating autoload files 您现在应该可以运行phpspec CLI了: 1# I like to have /vendor/bin in my path 2export> 3 4# Or run it with the path 5$ ./vendor/bin/phpspec 6phpspec 4.0.3 7 8Usage: 9command [options] [arguments]10...配置我们的套件 phpspec将在项目根目录中查找phpspec.yml文件的配置文件。我们可以使用此文件来配置测试套件、格式化程序和其他配置规则。 配置文档非常丰富,因此您应该查看它,但出于我们的目的,我们只想配置PSR-4名称空间,这样我就可以引导您完成使用PhpSpec驱动规范的工作流。 PhpSpec使用一个名为\"suites\"的顶级YAML键,因此让我们通过创建药典文件在我们项目的根目录中: 1suites:2default:3namespace: PredmondCalculator4psr4_prefix: PredmondCalculator5formatter.name: pretty 我们可以使用这个套件创建一个计算器类并导出一个基本的计算器规范。让我们开始工作吧!工作流 我们使用PhpSpec的工作流通常如下所示: 1. 描述规范 2. 运行规范(如果不存在则创建类) 3. 编写预期行为 4. 运行规范(如果不存在则创建方法) 5. 编写实现 6. 验证行为 7. 重复 PhpSpec的工作方式很好地迫使您进入这个BDD工作流,您可能一开始会反对这个工作流,但一旦您习惯了,它往往是一个可靠的编码工作流。让我们看一个工作流的快速示例,这样您就可以尝试一下了!描述规范我们要做的第一件事就是定义一个规范。在我们的例子中,我们将描述一个计算器。您可以使用describe命令定义一个规范(可以将其视为创建一个测试类)。运行以下命令创建计算器规范: 1$ ./vendor/bin/phpspec describe Predmond/Calculator/Calculator23# Or you can use backslashes with quotes4$ ./vendor/bin/phpspec describe \"PredmondCalculatorCalculator\" 运行此命令将在spec/CalculatorSpec.php中创建规范文件,如下所示: 1shouldHaveType(Calculator::class);14}15} 请注意,我们尚未创建实际的计算器类。我们的文件包括一个规范文件(it_is_initializable)-PhpSpec使用带有公共函数的it_和its_来查找规范。 另外,请注意下划线方法名称约定,这是一种倾向于更具可读性的固执己见的样式。BDD的一个目标是使用对人类友好的语言来描述行为。 现在我们有了规范,让我们使用run来运行规范: 1$ ./vendor/bin/phpspec run 2PredmondCalculatorCalculator 3 411! is initializable 5class PredmondCalculatorCalculator does not exist. 6... 71 specs 81 examples (1 broken) 918ms1011Do you want me to create `PredmondCalculatorCalculator` for you? [Y/n] 输入\"Y\",PhpSpec将创建Calculator类。重新运行规范将使我们的it_is_initializable规范通过: 1$ ./vendor/bin/phpspec run23PredmondCalculatorCalculator4511✔ is initializable671 specs81 examples (1 passed)99ms 您刚刚描述了您的第一个规范,PhpSpec负责为我们创建方法和代码的细节!让我们深入研究创建更多的规范。创建一个加法规范 让我们在计算器类中推出一个加法设计。我们的规范是绿色的,所以我们准备在实现它之前编写一个新的规范。打开spec/CalculatorSpec.php文件并添加以下内容: 1function it_can_add_two_numbers()2{34} 我没有添加任何代码,因为我想向您展示PhpSpec如何指导您下一步的操作,这非常简洁: 1$ ./vendor/bin/phpspec run 2 3PredmondCalculatorCalculator 4 511✔ is initializable 616- can add two numbers 7todo: write pending example 8 9101 specs112 examples (1 passed, 1 pending)1211ms PhpSpec告诉我们有一个待定的规范。现在让我们来解释一下: 1function it_can_add_two_numbers()2{3$this->add(2,3)->shouldReturn(5);4} 我们使用规范说:\"用参数2和3调用add(),add()应该返回5。 这里有一个需要理解的要点:$this就是我们描述的对象。您不需要像在其他测试套件中那样构造对象: 1# Other test suites34# PhpSpec $this is the Calculator5$this->add(); // And string some matching expectations... 如果我们现在尝试运行我们的规范,PhpSpec将告诉我们下一步: 1$ ./vendor/bin/phpspec run 2 3PredmondCalculatorCalculator 4 511✔ is initializable 616! can add two numbers 7method PredmondCalculatorCalculator::add not found. 8 9----broken examples1011Predmond/Calculator/Calculator1216! can add two numbers13method PredmondCalculatorCalculator::add not found.1415161 specs172 examples (1 passed, 1 broken)1811ms1920Do you want me to create21`PredmondCalculatorCalculator::add()` for you? [Y/n] 1$ ./vendor/bin/phpspec run 2 3PredmondCalculatorCalculator 4 511✔ is initializable 616✘ can add two numbers 7expected [integer:5], but got null. 8 9----failed examples1011Predmond/Calculator/Calculator1216✘ can add two numbers13expected [integer:5], but got null.1415161 specs172 examples (1 passed, 1 failed)1811ms 如果我们确认\"Y\",PhpSpec将在我们的实现上定义add()方法。种类很酷吧? 一旦您确认,我们的规范立即失效。这意味着是时候编写最少的代码来通过规范了。 此时我们的***30***类已经由PhpSpec生成。它应该是这样的: ***31*** 基于我们的***32***规范,PhpSpec创建了一个公共***33***方法,定义了两个参数。让我们做最少量的工作来让这个测试通过: ***34*** 大多数时候做最少量的代码是荒谬的,但请坚持我的观点,因为当你测试更复杂的规范时,编写最少量的代码可以帮助你构建一个健壮的规范。 既然我们已经编写了最少量的代码,是时候重新运行我们的规范了: ***35*** 我们的规范通过了!它不是很有用,但是它是绿色的。 让我们在我们的规范中再添加几个例子来驱动实现: ***36*** 如果您重新运行您的规范,我们的新增规范将失败。我们已经准备好更新我们的实现,现在让事情回到绿色: ***37*** 运行***38***将导致两个规范都通过。除法 让我们快速编写一个更有趣的规范:防止被零错误除法。当这种情况发生时,我们将抛出一个异常。 规范可能如下所示: ***39*** 实现: ***40*** 如果您运行规范,您应该得到一个除法为零的警告: ***41*** 让我们通过在分母为零时抛出异常来解决这个问题: ***42*** 和确保在***43***文件夹中创建异常类: ***44*** 现在运行我们的规范应该通过: ***45***构造对象和匹配器 在结束之前,我想介绍两个重要的概念:构造对象和匹配器。 我们的计算器类非常基本,但是您可能需要构造具有依赖关系的对象。您应该阅读对象构造部分以获得概述。 Matchers在PhpSpec中用于描述对象的行为。你打电话给***46***时已经使用了身份匹配器。***47***使用identity操作符(***48***)确保规范符合预期。您可以使用的四种类型的身份匹配器是: ***49*** 当我们希望***50***方法引发***51***异常时,您也使用了Throw Matcher。 您可以查看完整的matchers文档,并将其用作使用PhpSpec的参考。了解更多信息 我们刚刚触及了它的表面PhpSpec能做什么。我们没有展示合作者,但也许我们可以用更多的例子来做后续文章。你应该通读整个PhpSpec手册,它不是很长。一旦你掌握了一些东西,就可以了解Prophet对象,包括存根、模拟和间谍。 我有一个使用PhpSpec(和TravisCI)的小型HTML-to-AMP库。MikeStowe有一篇很好的介绍性文章,名为\"什么是规范驱动的开发\",它将为您概述SpecBDD。

CSS无头WordPress到底有多合适?

我想知道无头WordPress会在哪里登陆。\"headless\"指的是只使用WordPress管理,通过WordPress restapi构建面向用户的站点,而不是传统的WordPress主题结构?WordPress的未来?还是相对利基?需求在哪里?当然,对它有需求。我知道很多人都这么做。例如,Gatsby有一个gatsby-source-wordpress插件,它允许您以使用wordpressrestapi的方式从WordPress站点获取内容,并将其缓存为GraphQL,以便在React-power...

日期:2021-06-24 01:15:34 浏览:624

CSS制作带有粘性页眉和页脚的表格变得更容易了

不久前,当我在博客中看到HTML中的粘性页眉和页脚时,一个表同时有粘性页眉和粘性第一列。在它里面,我从来没有在任何、或元素上使用position: sticky,因为即使Safari和Firefox可以做到这一点,Chrome也做不到。但是它可以做表格单元格,比如和,这是一个相当不错的解决办法。好吧,这已经改变了。我通过Twitter听说Chrome在v91中\"重写了表格\"。https://t.co/vTBplXWWtT我看到它掉了下来,升级了,然后做了一个快速测试。嘿,看看有粘性的表格页眉和页脚。@C...

日期:2021-06-24 02:00:01 浏览:939

CSS技巧编年史XXXX

只是我最近做的一些非现场工作的一个小链接汇总。就像我习惯的那样。DevJourney播客#151 Chris Coyier从陶瓷到CSS技巧和代码笔\"Chris带我们从玩他的第一个C64到他的陶瓷文学学士,再回到web开发。我们讨论了他在这一过程中的不同立场,以及他们是如何缓慢但肯定地引导他走向web开发的。我们浏览了CSS技巧的创造和娱乐,在开放中学习,以及美好的一天是什么样子。Podrocket Podcast火箭手术:Kaelan和Chris Coyier比较笔记我被要求删除这里嵌入的音频,如果你想...

日期:2021-06-24 02:00:03 浏览:865

CSS使用子资源完整性保护您的网站

当您从外部服务器加载文件时,您相信您请求的内容是您期望的内容。由于您不自己管理服务器,因此您依赖于另一个第三方的安全性,从而增加了攻击面。信任第三方并不是天生的坏事,但它肯定应该在网站安全的背景下加以考虑。一个真实的例子这不是纯粹的理论危险。忽视潜在的安全问题可能而且已经造成严重后果。2019年6月4日,Malwarebytes宣布他们在网站上发现了一个恶意的略读程序NBA.com. 由于Amazon S3存储桶受损,攻击者能够修改JavaScript库以窃取客户的信用卡信息。值得担心的不仅仅是JavaSc...

日期:2021-06-24 02:00:03 浏览:768

CSS联合的可能性

这是首字母缩略词RSS中不是形容词的一个词。非常简单联合更新:Lol这里有两个错误。RSS是首字母缩写而不是首字母缩写,\"Really\"是副词而不是形容词。RSS不仅仅是RSS阅读器。尽管如此,如果我不喜欢RSS阅读器。它是关于把内容放在一种设计成可移植的格式。内容的API并不是一个隐喻,这就是它的字面含义。RSS一直在我的脑海中,因为它就像我的日报,但我敢打赌它并不是人们关注的最高峰,甚至是开发者。尽管如此,它还是受到了一点关注,因为谷歌在androidchrome中引入了一个\"following\...

日期:2021-06-24 03:00:02 浏览:596

CSS在开放细节元素上添加背景

关于元素有一点奇怪,那就是,当它打开时,并不总是100%清楚该元素内部的内容和不内部的内容。我不是说总是重要,或者说它是一个特别难解决的问题,我只是注意到它最近出现在我身上。这里有一个直观的例子:这里的文本在里面,什么不是?这个解决方案是…CSS。把的样式设计得有点独特,这样问题就解决了。即使你希望排版是一样的,或者你不想任何独家风格,直到被打开,这仍然是可能的。使用alpha透明填充,您甚至可以确保更深的嵌套保持清晰。对于只插入内联内容的<详细信息>(如\"spoiler\"UI或其他内容),...

日期:2021-06-24 03:00:04 浏览:764

CSS容器查询的聚宝盆

我不知道是什么原因,但是我的feed在过去的几周里充斥着关于CSS容器查询的文章。有关集装箱查询的热议实际上始于去年12月,当时米丽亚姆•苏珊娜(Miriam Suzanne)发布了一份提案(采纳了大卫•巴隆的提案),但3月底,Una Kravets在推特上发布的一条消息称,他们在chrome://flags的#enable-container-queries旗后投放了Chrome Canary 91.0.4459.0在如此短的时间内,容器查询已经覆盖了如此多的地方,而且规范甚至还不是最终的!我很高兴看到C...

日期:2021-06-24 03:00:04 浏览:922

CSS target=blank

那会不会让你的眼睛有点抽搐?就像…是打字错误。值的开头应该是带有下划线的>。就像…Welp, that\"s correct syntax!In the case of the no-underscore>, the blank部分只是一个名称。可能是任何东西。它可以是>,或者,可能是为了预示这里的目的:>。是一个特殊的关键字,它将在新选项卡中打开链接,每次都打开一个新选项卡。>将在新选项卡中打开第一个单击的链接,但任何共享>的链接都将在新打开的选项卡中打开。我从来不知道这一点!我相信这条微博的解释。我创建...

日期:2021-06-24 04:00:02 浏览:1004

CSS查看WCAG 2.5.5以获得更好的目标尺寸

你有没有经历过这样的挫折:试图点击移动设备上的一个按钮却什么也不做,因为目标大小不够大,而且它在你的按键上不起作用?也许你有更大的手指,像我一样,也可能是由于灵活性有限。这是因为我们,即用户,必须与之交互的元素的目标区域越来越小,我们来谈谈如何使其足够大,以便用户能够轻松地与元素交互。如果用户在一个小型手持式触摸屏设备上访问内容,而这个设备的不动产要紧得多,那么这将是一个特别大的问题。成功标准重温我在上一篇涉及WCAG 2.1标准的文章中谈到了成功标准,Label in Name。简言之,WCAG标准是我们...

日期:2021-06-24 04:00:03 浏览:544

CSS Trickz:Netlify随需应变构建器的实验

默认情况下,WordPress站点有一个API。想看看这个网站的最新帖子吗,只是一组特定的数据…JSON格式?给你。Alex Riviere用它做了一个笑话站点。起初,当加载该API客户端时,该站点将fetch。很好,但是如果我们认真考虑一下,它对于访问站点的人来说是非常低效的(也就是说,比服务器呈现的HTML慢),对于API命中率也不是很高。所以,Alex用Netlify函数重新编写了它。然后Netlify函数将从API中fetch(在云中的节点中),并为预呈现的HTML提供服务。这可能更好一些,但正如亚...

日期:2021-06-24 04:00:04 浏览:593