0

0

测试laravel commands的方法详解

藏色散人

藏色散人

发布时间:2020-04-13 13:57:58

|

5326人浏览过

|

来源于segmentfault

转载

引言

最近使用到laravel的consolo命令行工具,在编写命令,想写一些测试的时候,发现官方文档中并没有提到command的测试方法。花了点时间,翻墙找了资料,实践成功并记录一下,方便更多人。

推荐:《laravel教程

测试方法

大家都知道Laravel中使用了很多Symfony的成熟组件,Laravel的console组件使用的就是Symfony/console。

幸运的是,Symfony/console 组件中提供了用于command测试的CommandTester, 使用方法如下

...
use FooCommand;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Tester\CommandTester;
...
public function testSample(){
    //创建一个console测试应用平台,用来搭载测试的命令
    $application = new Application();
    
    //创建待测试的command
    $testedCommand = $this->app->make(FooCommand::class);
    //设置命令执行需要的laravel依赖
    $testedCommand->setLaravel(app());
    //添加待测试的command到测试应用上
    //同时command 也绑定 application
    $application->add($testedCommand);
    //实例化命令测试类
    $commandTester = new CommandTester($testedCommand);
    //命令输入流,对应每次交互需要提供的输入内容
    $commandTester->setInputs([
        //...
        ]);
    //执行命令
    $commandTester->execute(['command' => $testedCommand->getName()]);
    //对命令执行结果进行断言测试,主要是依靠正则判断
    //$commandTester->getDisplay() 方法可以获取命令执行后的输出结果
    $this->assertRegExp("/some reg/", $commandTester->getDisplay());
}

示例

我们现在有一个手动创建新用户的命令createUser,作用就是手动创建一个用户。

需要交互式让用户输入name,email,password,comfirm password,这些数据。

待测试的command

line($this->description);
        // 获取输入的数据
        $data = [
            'name' => $this->ask('What\'s your name?'),
            'email' => $this->ask('What\'s your email?'),
            'password' => $this->secret('What\'s your password?'),
            'password_confirmation' => $this->secret('Pleas confirm your password.')
        ];
        // 验证输入内容
        $validator = $this->makeValidator($data);
        if ($validator->fails()) {
            foreach ($validator->errors()->toArray() as $error) {
                foreach ($error as $message) {
                    $this->error($message);
                }
            }
            return;
        }
        // 向用户确认输入信息
        if (!$this->confirm('Confirm your info: ' . PHP_EOL . 'name:' . $data['name'] . PHP_EOL . 'email:' . $data['email'] . PHP_EOL . 'is this correct?')) {
            return;
        }
        // 注册
        $user = $this->create($data);
        event(new Registered($user));
        $this->line('User ' . $user->name . ' successfully registered');
    }
    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function makeValidator($data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255|unique:users',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed'
        ]);
    }
    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array $data
     * @return \App\User
     */
    protected function create($data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password'])
        ]);
    }
}

正确的结果

家电小商城网站源码1.0
家电小商城网站源码1.0

家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l

下载

如果正确输入信息的话,会得到如下输出

$ path-to-your-app/app# php artisan createUser
create new user for system manually
 What's your name?:
 > vestin
 What's your email?:
 > correct@abc.com
 What's your password?:
 > 
 Pleas confirm your password.:
 > 
 Confirm your info: 
name:vestin
email:correct@abc.com
is this correct? (yes/no) [no]:
 > yes
User vestin successfully registered

想要测试的内容

我想要测试两块内容:

1.数据输入验证测试

● email有效性测试

● password两次输入是否相同的测试

2.正确创建用户测试

● 编写单元测试

app->make(CreateUser::class);
        $testedCommand->setLaravel(app());
        $application->add($testedCommand);
        $commandTester = new CommandTester($testedCommand);
        $commandTester->setInputs(['Vestin', 'badEmail@abc', '123456', '654321']);
        $commandTester->execute(['command' => $testedCommand->getName()]);
        // assert
        $this->assertRegExp("/The email must be a valid email address/", $commandTester->getDisplay());
        $commandTester->setInputs(['vestin', 'correct@abc.com', '123456', '654321']);
        $commandTester->execute(['command' => $testedCommand->getName()]);
        // assert
        $this->assertRegExp("/The password confirmation does not match/", $commandTester->getDisplay());
    }
    /**
     * 测试成功注册用户
     *
     * @return void
     */
    public function testSuccess()
    {
        $application = new Application();
        $testedCommand = $this->app->make(CreateUser::class);
        $testedCommand->setLaravel(app());
        $application->add($testedCommand);
        $commandTester = new CommandTester($testedCommand);
        $commandTester->setInputs(['Vestin', 'correct@abc.com', '123456', '123456', 'y']);
        $commandTester->execute(['command' => $testedCommand->getName()]);
        // assert
        $this->assertRegExp("/User Vestin successfully registered/", $commandTester->getDisplay());
        $this->assertDatabaseHas('users', [
            'email' => 'correct@abc.com',
            'name' => 'Vestin'
        ]);
    }
}

执行测试

$ path-to-your-app/app#  ./vendor/bin/phpunit 
PHPUnit 6.4.3 by Sebastian Bergmann and contributors.
..                                                                  3 / 3 (100%)
Time: 659 ms, Memory: 14.00MB

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

78

2025.09.11

laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

276

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

370

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号