Laravel试验中播种数据的介绍

自从在Laravel 5.1中发布种子植入以来,测试变得越来越简单和快速。 您可以有十个用户,每个用户都有一个帖子,或者在测试开始之前插入一个或多个帖子的1000个用户。 在本教程中,您将创建一个测试用例来测试用户模型,并创建一个种子植入器来为十个用户进行种子植入,每个用户都遵循一个用户进入数据库。 首先,我们需要创建数据库表。迁移 创建一个表来存储用户之间的关系(谁跟随谁)。 1# database/migrations/2014_10_12_000000_create_users_table.php 2class CreateUsersTable extends Migration 3{ 4/** 5* Run the migrations. 6* 7* @return void 8*/ 9public function up()10{11Schema::create(\"users\", function (Blueprint $table) {12$table->increments(\"id\");13$table->string(\"name\");14$table->string(\"email\")->unique();15$table->string(\"password\");16$table->rememberToken();17$table->timestamps();18});1920// following table is storing the relationship between users21// user_id is following follow_user_id22Schema::create(\"following\", function (Blueprint $table) {23$table->integer(\"user_id\")->unsigned()->index();24$table->foreign(\"user_id\")->references(\"id\")->on(\"users\")->onDelete(\"cascade\");2526$table->integer(\"follow_user_id\")->unsigned()->index();27$table->foreign(\"follow_user_id\")->references(\"id\")->on(\"users\")->onDelete(\"cascade\");2829$table->timestamps();30});31}3233/**34* Reverse the migrations.35*36* @return void37*/38public function down()39{40Schema::dropIfExists(\"following\");41Schema::dropIfExists(\"users\");42}43} 接下来,运行迁移。 1php artisan migrate2Migration table created successfully. 如果您的应用程序版本是5.4,你会看到下面的错误: 1[IlluminateDatabaseQueryException]23SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))4[PDOException]5SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 不要惊慌!请查看本文中的解决方法。 应用解决方法后,删除以前创建的表,然后再次运行迁移。 1php artisan migrate2Migration table created successfully.3Migrated: 2014_10_12_000000_create_users_table4Migrated: 2014_10_12_100000_create_password_resets_table 数据库已准备就绪。现在,让我们准备用户模型。用户模型 在本例中,用户模型是测试主题,它有一些方法来创建和检索用户之间的关系。 1# app/User.php 2class User extends Authenticatable 3{ 4use Notifiable; 5 6/** 7* The attributes that are mass assignable. 8* 9* @var array10*/11protected>12\"name\", \"email\", \"password\",13];1415/**16* The attributes that should be hidden for arrays.17*18* @var array19*/20protected>21\"password\", \"remember_token\",22];2324public function follows(User $user)25{26$this->following()->attach($user->id);27}2829public function unfollows(User $user)30{31$this->following()->detach($user->id);32}3334public function following()35{36return $this->belongsToMany(\"AppUser\", \"following\", \"user_id\", \"follow_user_id\")->withTimestamps();37}3839public function isFollowing(User $user)40{41return !is_null($this->following()->where(\"follow_user_id\", $user->id)->first());42}43} 用户模型已准备好测试。接下来,我们将向数据库中插入数据。 Seeding Laravel使执行Seeding变得非常容易。默认情况下,seeder类包含run方法。您可以使用查询生成器或雄辩的模型工厂插入数据。 让我们运行Artisan命令生成播种机。 1php artisan make:seeder UsersTableSeeder 然后,您可以使用模型工厂在run方法中生成10个用户。 1# database/seeds/UsersTableSeeder.php 2use AppUser; 3use IlluminateDatabaseSeeder; 4 5class UsersTableSeeder extends Seeder 6{ 7/** 8* Run the database seeds. 9*10* @return void11*/12public function run()13{15}16} 运行artisan命令以执行种子设定。 1php artisan db:seed> 您还可以在DatabaseSeeder run方法中启用对UsersTableSeeder的调用。 1# database/seeds/UsersTableSeeder.php 2use AppUser; 3use IlluminateDatabaseSeeder; 4 5class UsersTableSeeder extends Seeder 6{ 7/** 8* Run the database seeds. 9*10* @return void11*/12public function run()13{15}16} 运行artisan命令以执行种子设定。 1php artisan db:seed> 您还可以在DatabaseSeeder run方法中启用对UsersTableSeeder的调用。 1# database/seeds/DatabaseSeeder.php 2class DatabaseSeeder extends Seeder 3{ 4/** 5* Run the database seeds. 6* 7* @return void 8*/ 9public function run()10{11$this->call(UsersTableSeeder::class);12}13} 接下来,运行命令而不声明seeder类名。 1php artisan db:seed 使用DatabaseSeeder,您可以执行多个seeder类。 现在,我们将处理测试用例。在本教程中,测试用例的目标是测试用户模型中的follow和unfollow方法。 我们将首先生成一个新的测试。 1php artisan make:test UserTest先决条件测试 首先,我们将创建一个测试以确保数据库中有10个用户。 1# tests/Feature/UserTest.php 2use AppUser; 3 4class UserTest extends TestCase 5{ 6public function test_have_10_users() 7{ 8$this->assertEquals(10, User::count()); 9}10} 运行PHPUnit。 1phpunit 如果它不起作用,试试这个。 1vendor/bin/phpunit2PHPUnit 5.7.17 by Sebastian Bergmann and contributors.3... 3 / 3 (100%)4Time: 2.72 seconds, Memory: 12.00MB5OK (3 tests, 3 assertions) 为什么php不起作用?也许你的机器版本不符合Laravel的要求。Laravel通过Composer预先安装了PHPUnit。你可以运行它。在我的例子中,vendor/bin/phpunit工作正常。在本教程的其余部分,我将使用vendor/bin/phpunit。测试 通过完成上一步,您可以确认种子设定和单元测试工作正常。创建真正的测试是绿灯。 1# tests/Feature/UserTest.php 2public function test_follows() 3{>> 6 7$userA->follows($userB); 8 9$this->assertEquals(2, $userA->following()->count());10}1112public function test_unfollows()13{1617$userA->unfollows($userB);1819$this->assertEquals(0, $userA->following()->count());20}2122public function test_A_follows_B_and_C()23{25283132$userA->follows($userB);33$userA->follows($userC);3435$this->assertEquals(2, $userA->following()->count());36} 再次运行PHPUnit。 1vendorinphpunit2PHPUnit 5.7.17 by Sebastian Bergmann and contributors.3...... 6 / 6 (100%)4Time: 1.23 seconds, Memory: 10.00MB5OK (6 tests, 6 assertions) 所有测试都通过了!酷!我建议您再次运行测试以测试一致性。 1vendorinphpunit 2PHPUnit 5.7.17 by Sebastian Bergmann and contributors. 3..F.F. 6 / 6 (100%) 4Time: 1.25 seconds, Memory: 10.00MB 5There were 2 failures: 61) TestsFeatureUserTest::test_follows 7Failed asserting that 3 matches expected 2. 8C:xampphtdocsTestWithSeed estsFeatureUserTest.php:26 92) TestsFeatureUserTest::test_A_follows_B_and_C10Failed asserting that 4 matches expected 2.11C:xampphtdocsTestWithSeed estsFeatureUserTest.php:521213FAILURES!14Tests: 6, Assertions: 6, Failures: 2. 哦!两次测试失败。怎么回事? 首次运行测试时,测试已对数据库中的数据进行了更改。因此,当您再次运行测试时,更改的数据会影响测试结果。 这并不意味着应用程序有错误。处理这种情况是测试用例的责任。我建议在每次测试运行之前重置数据库。重置数据库 建议一,在PHPUnit之前运行迁移刷新和种子设定。 1php artisan migrate:refresh --seed2vendorinphpunit 更好的建议是使用Traits。Laravel提供了两种在每次测试后重置数据库的方法。它们是数据库迁移和数据库事务。 让我们试试数据库迁移。 1# tests/Feature/UserTest.php2class UserTest extends TestCase3{4use DatabaseTransactions;56...7} 运行测试。 1vendorinphpunit 2PHPUnit 5.7.17 by Sebastian Bergmann and contributors. 3 4..EEE.6 / 6 (100%) 5 6Time: 5.53 seconds, Memory: 12.00MB 7 8There were 3 errors: 9101) TestsFeatureUserTest::test_follows11Error: Call to a member function follows() on null1213C:xampphtdocsseeding-data-in-the-testing estsFeatureUserTest.php:2514152) TestsFeatureUserTest::test_unfollows16Error: Call to a member function unfollows() on null1718C:xampphtdocsseeding-data-in-the-testing estsFeatureUserTest.php:3519203) TestsFeatureUserTest::test_A_follows_B_and_C21Error: Call to a member function follows() on null2223C:xampphtdocsseeding-data-in-the-testing estsFeatureUserTest.php:502425ERRORS!26Tests: 6, Assertions: 3, Errors: 3. 不太好。迁移正在工作,但种子没有调用数据库迁移。 没关系;让我们尝试一下数据库事务。 1# tests/Feature/UserTest.php2class UserTest extends TestCase3{4use DatabaseTransactions;56...7} 再次运行测试。 1vendorinphpunit2PHPUnit 5.7.17 by Sebastian Bergmann and contributors.34......6 / 6 (100%)56Time: 7.29 seconds, Memory: 14.00MB78OK (6 tests, 6 assertions) 一切正常!DatabaseTransactions Trait将每个测试的查询包装到一个事务中,因此来自上一个测试的数据不会干扰后续测试。结论 用计划的测试数据为数据库播种可以模拟许多不同的情况,并且可以轻松加载大量数据。 越少越好。用更少的努力获得更好的结果。 您可以从这里使用示例项目。

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

CSS技巧编年史XXXX

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

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

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

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

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

CSS联合的可能性

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

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

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

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

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

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

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