如何在PHP单元测试中传递参数

时间:2018-05-16 11:50:02

标签: php unit-testing

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

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()方法中输入什么来传递要测试的电子邮件?我正在阅读文档,但作为一个新手,信息是压倒性的,我找不到解决方案。

1 个答案:

答案 0 :(得分:1)

您可以使用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'