<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 數據庫測試 - [簡介](#introduction) - [每次測試后重置數據庫](#resetting-the-database-after-each-test) - [使用遷移](#using-migrations) - [使用事務](#using-transactions) - [模型工廠](#writing-factories) - [多個工廠類型](#factory-types) - [在測試中使用工廠](#using-factories) - [創建模型](#creating-models) - [持久化模型](#persisting-models) - [模型關聯](#relationships) <a name="introduction"></a> ## 簡介 Laravel 也提供了多種有用的工具來讓你更容易的測試使用數據庫的應用程序。首先,你可以使用 `seeInDatabase` 輔助函數,來斷言數據庫中是否存在與指定條件互相匹配的數據。舉例來說,如果我們想驗證 `users` 數據表中是否存在 `email` 值為 `sally@example.com` 的數據,我們可以按照以下的方式來做測試: public function testDatabase() { // 創建調用至應用程序... $this->seeInDatabase('users', [ 'email' => 'sally@example.com' ]); } 當然,使用 `seeInDatabase` 方法及其它的輔助函數只是為了方便。你也可以隨意使用 PHPUnit 內置的所有斷言方法來擴充測試。 <a name="resetting-the-database-after-each-test"></a> ## 每次測試后重置數據庫 在每次測試結束后都需要對數據進行重置,這樣前面的測試數據就不會干擾到后面的測試。 <a name="using-migrations"></a> ### 使用遷移 其中有一種方式就是在每次測試后都還原數據庫,并在下次測試前運行遷移。Laravel 提供了簡潔的 `DatabaseMigrations` trait,它會自動幫你處理好這些操作。你只需在測試類中使用此 trait 即可: <?php use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { use DatabaseMigrations; /** * 基本的功能測試示例。 * * @return void */ public function testBasicExample() { $this->visit('/') ->see('Laravel 5'); } } <a name="using-transactions"></a> ### 使用事務 另一個方式,就是將每個測試案例都包含在數據庫事務中。Laravel 提供了一個簡潔的 `DatabaseTransactions` trait 來自動幫你處理好這些操作。 <?php use Illuminate\Foundation\Testing\WithoutMiddleware; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseTransactions; class ExampleTest extends TestCase { use DatabaseTransactions; /** * 基本的功能測試示例。 * * @return void */ public function testBasicExample() { $this->visit('/') ->see('Laravel 5'); } } > {note} 此 trait 的事務只包含默認的數據庫連接。 如果你的應用程序使用多個數據庫連接,就需要你手動處理事務和多個數據庫之間的業務邏輯。 <a name="model-factories"></a> ## 模型工廠 測試時,常常需要在運行測試之前寫入一些數據到數據庫中。創建測試數據時,除了手動的來設置每個字段的值,還可以使用 [Eloquent 模型](/docs/{{version}}/eloquent) 的「工廠」來設置每個屬性的默認值。在開始之前,你可以先查看下應用程序的 `database/factories/ModelFactory.php` 文件。此文件包含一個現成的工廠定義: $factory->define(App\User::class, function (Faker\Generator $faker) { return [ 'name' => $faker->name, 'email' => $faker->email, 'password' => bcrypt(str_random(10)), 'remember_token' => str_random(10), ]; }); 閉包內為工廠的定義,你可以返回模型中所有屬性的默認測試值。在該閉包內會接收到 [Faker](https://github.com/fzaninotto/Faker) PHP 函數庫的實例,它可以讓你很方便的生成各種隨機數據以進行測試。 當然,你也可以隨意將自己額外的工廠增加至 `ModelFactory.php` 文件。你也可以在 `database/factories` 里為每一個數據模型創建對應的工廠模型類,如 `UserFactory.php` 和 `CommentFactory.php`。 在 `factories` 目錄中的文件都會被 Laravel 自動加載。 <a name="factory-types"></a> ### 多個工廠類型 有時你可能希望針對同一個 Eloquent 模型類來創建多個工廠。例如,除了一般用戶的工廠之外,還有「管理員」工廠。你可以使用 `defineAs` 方法來定義這個工廠: $factory->defineAs(App\User::class, 'admin', function ($faker) { return [ 'name' => $faker->name, 'email' => $faker->email, 'password' => str_random(10), 'remember_token' => str_random(10), 'admin' => true, ]; }); 除了從一般用戶工廠復制所有基本屬性,你也可以使用 `raw` 方法來獲取所有基本屬性。一旦你獲取到這些屬性,就可以輕松的為其增加任何額外值: $factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) { $user = $factory->raw(App\User::class); return array_merge($user, ['admin' => true]); }); <a name="using-factories"></a> ## 在測試中使用工廠 <a name="creating-models"></a> ### 創建模型 在工廠定義后,就可以在測試或是數據庫的填充文件中,通過全局的 `factory` 函數來生成模型實例。接著讓我們先來看看幾個創建模型的例子。首先我們會使用 `make` 方法創建模型,但不將它們保存至數據庫: public function testDatabase() { $user = factory(App\User::class)->make(); // 在測試中使用模型... } 你也可以創建一個含有多個模型的集合,或創建一個指定類型的模型: // 創建一個 App\User 實例 $users = factory(App\User::class, 3)->make(); // 創建一個 「admin」 類型的 App\User 實例 $user = factory(App\User::class, 'admin')->make(); // 創建 3 個 「admin」 類型的 App\User 實例 $users = factory(App\User::class, 'admin', 3)->make(); #### 重寫模型屬性 如果你想重寫模型中的某些默認值,則可以傳遞一個包含數值的數組至 `make` 方法。只有指定的數值會被替換,其它剩余的數值則會按照工廠指定的默認值來設置: $user = factory(App\User::class)->make([ 'name' => 'Abigail', ]); <a name="persisting-models"></a> ### 持久化工廠模型 你不僅可使用 `create` 方法來創建模型實例,而且也可以使用 Eloquent 的 `save` 方法來將它們保存至數據庫: public function testDatabase() { // 創建一個 App\User 實例 $user = factory(App\User::class)->create(); // 創建 3 個 App\User 實例 $users = factory(App\User::class, 3)->create(); // 在測試中使用模型... } 同樣的,你可以在數組傳遞至 `create` 方法時重寫模型的屬性 $user = factory(App\User::class)->create([ 'name' => 'Abigail', ]); <a name="relationships"></a> ### 模型關聯 在本例中,我們還會增加關聯至我們所創建的模型。當使用 `create` 方法創建多個模型時,它會返回一個 Eloquent [集合實例](/docs/{{version}}/eloquent-collections),讓你能夠使用集合所提供的便利函數,像是 `each`: $users = factory(App\User::class, 3) ->create() ->each(function ($u) { $u->posts()->save(factory(App\Post::class)->make()); }); #### 關聯和屬性閉包 你可以使用閉包參數來創建模型關聯。例如如果你想在創建一個 `Post` 的順便創建一個 `User` 實例: $factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { return factory(App\User::class)->create()->id; } ]; }); 這些閉包也可以獲取到生成的工廠包含的屬性數組: $factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { return factory(App\User::class)->create()->id; }, 'user_type' => function (array $post) { return App\User::find($post['user_id'])->type; } ]; }); ## 譯者署名 | 用戶名 | 頭像 | 職能 | 簽名 | |---|---|---|---| | [@JobsLong](https://phphub.org/users/56) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/56_1427370654.jpeg?imageView2/1/w/100/h/100"> | 翻譯 | 我的個人主頁:[http://jobslong.com](http://jobslong.com) |
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看