首页 > 解决方案 > 如何在 PHP 单元测试中传递参数

问题描述

我正在尝试学习如何为我的自定义“框架”创建单元测试,这是一种在用户注册时验证电子邮件地址的方法。

private function verifyEmail()
{
    if(empty($this->email) || empty($this->email_repeat)) {
        throw new \Exception('please enter email');
    }
    if($this->email != $this->email_repeat) {
        throw new \Exception('emails don\'t match');
    }
    if(!filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
        throw new \Exception('E-mail is invalid');
    }

    $isTaken = $this->db->getRow("SELECT COUNT(*) as count FROM users WHERE email = ?", [$this->email]);
    if($isTaken->count > 0){
        throw new \Exception('E-mail is taken');
    }
}

这是单元测试

class RegisterTest extends \PHPUnit\Framework\TestCase
{
    public function testVerifyEmail() {
        // what do i type here?
    }
}

那么,我在testVerifyEmail()方法中输入什么来传递要测试的电子邮件呢?我正在浏览文档,但作为一个新手,信息是压倒性的,我找不到解决方案。

标签: phpunit-testing

解决方案


您可以使用 PhpUnit DataProvider 为您的测试方法提供参数。

https://phpunit.de/manual/6.5/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers

此处的示例将执行 testMethod 4 次(每个 $data 项执行一次)。

<?php

use PHPUnit\Framework\TestCase;

class DataTest extends TestCase
{
    /**
     * @dataProvider myProvider
     */
    public function testMethod($a, $b, $expected)
    {
        var_dump($a,$b,$expected);

        //... your assertions here
    }

    public function myProvider()
    {
        $data =  [
            //each item represents the related method parameter
            //the first time $a = 'valueOfA-0', $b='valueOfB-0',$expected='valueOfExpected-0' 
            //and so on, for each array
            ['valueOfA-0', 'valueOfB-0', 'valueOfExpected-0'],
            ['valueOfA-1', 'valueOfB-1', 'valueOfExpected-1'],
            ['valueOfA-2', 'valueOfB-2', 'valueOfExpected-2'],
            ['valueOfA-3', 'valueOfB-3', 'valueOfExpected-3'],
        ];

        return $data;
    }
}

//values of testMethod parameters each time
//$a = 'valueOfA-0', $b='valueOfB-0', $expected='valueOfExpected-0'
//$a = 'valueOfA-1', $b='valueOfB-1', $expected='valueOfExpected-1'
//$a = 'valueOfA-2', $b='valueOfB-2', $expected='valueOfExpected-2'
//$a = 'valueOfA-3', $b='valueOfB-3', $expected='valueOfExpected-3'

推荐阅读