Laravel通过工厂州深入工厂

我怀疑,如果您熟悉Laravel,您可能会在应用程序开发中使用模型工厂,甚至可能使用工厂状态。文档向您展示了使用工厂来播种和创建测试数据的机制,但是我想考虑一些有效地将工厂与模型结合使用的指导思想。 以下是我在更有效地使用工厂状态时考虑的一些方法: 首先,使用静态值,而不是对所有内容都使用Faker。 其次,您的工厂应该只创建创建模型实例所需的最简单属性集。使用静态数据,而不是Faker 我并不是说使用Faker是错误的,而是,静态值可以使测试数据比随机数据更明显。 考虑下面的User工厂: 1$factory->define(AppUser::class, function (Faker $faker) {2return [7];8}); 代码示例是Laravel 5.6附带的用户工厂。工厂的定义和它毫无关系,我想批评它是完全正确的。但是,我想让您考虑一下,当您运行测试套件时,每次都会生成新的值: 1// First test run 2array:5 [>>>>> 8] 910// Second test run11array:5 [17] 您可能会觉得这种随机测试数据是一件好事,它使您的测试套件更加健壮。这是一个有效的论据,但是考虑一下你需要编写的验证数据的测试: 1public function testWelcomeMessageTest()2{46$response->assertSeeText(\"Welcome \".$user->name);7} 我想再次强调,这个测试本身没有什么问题,但我觉得有额外的\"魔力\"需要在你的大脑中进行一点解析。我使用一个变量来断言测试正在通过,而不是一个硬编码的断言,它使测试在我的脑海中更具可读性。 考虑以下工厂: 1$factory->define(AppUser::class, function (Faker $faker) {2return [5// ...6];7}); 硬编码的名称和电子邮件是一个微妙的变化,但现在我的测试可能看起来像这样: 1public function testWelcomeMessageTest()2{3factory(\"AppUser\")->create();46$response->assertSeeText(\"Welcome Example User\");7} 另一种方法是使用一个拥有动态数据并覆盖您想要测试的内容的工厂: 1public function testWelcomeMessageTest()2{3factory(\"AppUser\")->create([5]);68$response->assertSeeText(\"Welcome Example User\");9} 您应该在应用程序中做您觉得合适的事情,但我希望您至少考虑到您不必为所有事情都使用faker。事实上,由于这种微妙的变化,您的测试可能会更加清晰。 如果您不想失去faker提供的随机性,请考虑在默认测试中使用工厂状态,其中包含一些静态值: 1$factory->define(AppUser::class, \"user\", function (Faker $faker) {2return [5];6}); 然后在您的测试中,您需要一个基本值,静态用户: 1public function testWelcomeMessageTest()2{3factory(\"AppUser\")->states(\"user\")->create();46$response->assertSeeText(\"Welcome Example User\");7} user状态表示模型所需的基本属性集它是创建模型所需的最小可行属性。最小可行属性 使用创建模型所需的最小数据量创建工厂和测试数据是在您的系统中提倡的一个好习惯测验。如果一个字段是可以为null的,或者模型有可选的关系,不要在默认工厂中定义它们。 您的测试将更容易帮助您捕获null值和空关系的问题。空模型关系通常是用户在应用程序中遇到的第一种状态。 当数据库中的某个列可以为空时,默认情况下在工厂中忽略它,然后使用状态进一步测试具有超过所需最小数据的模型。 以论坛应用程序为例。当用户第一次注册时,将不会创建任何帖子,也不会对其他人的帖子发表任何评论。它代表应用程序中最基本的用户,具有最低的要求。 拥有工厂数据和伪造者供您使用,这使得您很容易填写尽可能多的数据,但只定义默认模型工厂状态中绝对必要的数据。使用状态增强工厂数据 使用示例对于论坛应用程序,我们可以为有帖子的用户定义一个状态,如果我们的测试需要的数据超过了最低要求: 1$factory2->state(AppUser::class, \"with_posts\", [])3->afterCreatingState(AppUser::class, \"with_posts\", function ($user, $faker) {4factory(AppPost::class, 5)->create([6]);7}); 这个状态没有任何重写数据,这样我们就可以将空数组作为第三个参数而不是闭包传递。我们使用afterCreatingState方法来定义一些与用户相关联的帖子,我们现在可以在测试中使用这些帖子: 这种方法的最大缺点是在afterCreatingState回调中硬编码5帖子。我只是在写伪代码,但是像这样的API可能很好: 2->states(\"with_posts\",>3->create(); 然后在工厂API的另一边,类似这样的东西: 1$factory2->state(AppUser::class, \"with_posts\", [])3->afterCreatingState(AppUser::class, \"with_posts\", function ($user, $faker, $config) {4factory(AppPost::class, $config->get(\"posts_count\", 5))->create([6]);7}); 同样,这是伪代码,不会工作!但我想展示几种方法,说明这种方法可能更好。也许这是一个包可以通过某种方式扩展基本工厂功能来实现此API的领域。 即使有缺点,我们仍然有一个很好的声明方式来使用带有post的用户状态。其他工厂状态方法我们还可以在测试框架中使用一个trait来为有帖子的用户创建一个更动态的状态,以及我们想要给用户的任何其他状态: ***17*** 在需要有帖子的用户的测试中,您可以使用以下内容: ***18*** 我想在顶部定义***19***,在这里我导入了trait,因为我一眼就能看出trait是用于工厂数据的。使用trait需要相当多的样板,但是比我们的静态工厂状态更灵活,posts计数硬编码为五。 learnmorep>您可以在Laravel文档中了解更多关于工厂状态的信息。如果您想更多地了解和思考工厂的工作方式,另一个优秀的资源是Ruby gem Factory Bot,特别是入门文档。 工厂应尽可能少是另一个关于使用工厂的优秀资源,作者是上述Factory Bot库的作者。

CSS无头WordPress到底有多合适?

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

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

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

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

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

CSS技巧编年史XXXX

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

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

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

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

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

CSS联合的可能性

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

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

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

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

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

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 浏览:912

CSS target=blank

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

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

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

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

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

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

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

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