• Testing Api using PHPUnit Laravel


    首先复制.env.example文件重命名为.env.testing:

    批注 2020-04-16 001122

    批注 2020-04-16 001140

    然后,执行:

    touch test.sqlite

    批注 2020-04-16 001411

    将在 D:/laragon/www/laraveauth 目录下生成一个test.sqlite文件:

    批注 2020-04-16 001514

    然后我们将.env.testing文件数据库配置修改为:

    DB_CONNECTION=sqlite
    DB_DATABASE="D:/laragon/www/laraveauth/test.sqlite"
    

    批注 2020-04-16 001636

    接下来执行:

    php artisan make:test TaskApiTest

    批注 2020-04-16 001758

    文件位于:

    批注 2020-04-16 001848

    接下来,修改这个文件之前,执行一下

    php artisan route:list
    

    查看一下api task请求的相关route:

    批注 2020-04-16 002115

    先来实现测试创建Task的方法:

    方法命名为比较容易理解的就行;

    批注 2020-04-16 002422

    发送post请求到/api/task;最后代码如下:

    public function testCanCreateTask()
    {
        $formData = [
            'title' => 'sample test task title',
            'description' => 'sample test task description',
            'due' => 'next friday',
        ];
    
        $response = $this->post(route('tasks.store'), $formData);
    
        $response->assertStatus(201);
    }
    

    由于phpunit存在于 vendorin文件夹下:

    批注 2020-04-16 003303

    所以:控制台执行:

    .vendorinphpunit.bat

    批注 2020-04-16 003410

    结果:

    批注 2020-04-16 003435

    错误解决:

    1.env.testing文件中APP_KEY未设置:

    批注 2020-04-16 003554

    拷贝一个.env文件中的即可;

    再次执行:

    .vendorinphpunit.bat

    结果:

    批注 2020-04-16 003725

    没有头绪,我们需要这个:

    $this->withoutExceptionHandling();

    批注 2020-04-16 004149

    再次执行:

    .vendorinphpunit.bat

    可以发现出现了更多的错误trace信息:

    批注 2020-04-16 004307

    结果就是 我们执行store方法前未登录:

    修改后及执行结果如下:

    批注 2020-04-16 005019

    修正方法:laragon开启pdo_sqlite扩展。【只要php开启sqlite的扩展就可以了】

    批注 2020-04-16 005633

    我们再在类内添加一个trait

    use RefreshDatabase;

    这个trait会在每次单元测试的时候刷新数据库。【对migration执行一次migrate】

    再次执行:

    .vendorinphpunit.bat

    批注 2020-04-16 005752

    测试通过!

    接下来我们断言Json

    批注 2020-04-16 010020

    结果失败:

    批注 2020-04-16 010112

    修改一下及结果仍然失败:

    批注 2020-04-16 010242

    再次修改:

    批注 2020-04-16 010414

    测试通过!

    其余的测试不写了。

    文档看这里:测试指南

    TaskApiTest.php文件如下:

    <?php
    
    namespace TestsFeature;
    
    use AppTask;
    use AppUser;
    use CarbonCarbon;
    use IlluminateFoundationTestingRefreshDatabase;
    use IlluminateFoundationTestingWithFaker;
    use TestsTestCase;
    
    class TaskApiTest extends TestCase
    {
        use RefreshDatabase;
    
        protected $user;
    
        public function setUp(): void
        {
            parent::setUp();
            $this->user = factory(User::class)->create();
            $this->actingAs($this->user, 'api');
        }
    
        /**
         * A basic feature test example.
         *
         * @return void
         */
        public function testCanCreateTask()
        {
            $due = Carbon::parse('next friday');
            $formData = [
                'title' => 'sample test task title',
                'description' => 'sample test task description',
                'due' => $due,
            ];
            $this->withoutExceptionHandling();
    
            $response = $this->post(route('tasks.store'), $formData);
            $response->assertStatus(201)
                ->assertJson(['data' => $formData]);
        }
    
        public function testCanShowTask()
        {
            $task = factory(Task::class)->create();
            $this->user->tasks()->save($task);
            $response = $this->get(route('tasks.show', $task->id));
            $response->assertStatus(200);
        }
    
        public function testUpdateTask()
        {
            $task = factory(Task::class)->create();
            $this->user->tasks()->save($task);
    
            $due = Carbon::parse('next friday');
    
            $formData = [
                'title' => 'sample test task title',
                'description' => 'sample test task description',
                'due' => $due,
            ];
            $this->withoutExceptionHandling();
    
            $response = $this->put(route('tasks.update', $task->id), $formData);
            $response->assertStatus(200)
                ->assertJson(['data' => $formData]);
        }
    
        public function testDelete()
        {
            $task = factory(Task::class)->create();
            $this->user->tasks()->save($task);
            $response = $this->delete(route('tasks.destroy', $task));
            $response->assertStatus(200)->assertJson(['message' => 'Success deleted!']);
        }
    
        public function testShowAllTasks()
        {
            $tasks = factory(Task::class, 3)->create();
            $this->user->tasks()->saveMany($tasks);
            $response = $this->get(route('tasks.index'));
            $response->assertStatus(200)->assertJson($tasks->toArray());
        }
    }
    
    
  • 相关阅读:
    初识Java8新特性Lambda(二) 之collections
    hadoop-2.5.0-cdh5.3.6 native包 替换
    初识Java8新特性Lambda(三 ) 之lambda类库Stream
    初识Java8新特性Lambda(一)
    js将文件流转为文件
    验证有效的外部链接
    gb2312编码转换
    Beautiful Soup4
    chromedriver版本下载
    redmine使用post登录,cookie使用
  • 原文地址:https://www.cnblogs.com/dzkjz/p/12709840.html
Copyright © 2020-2023  润新知