php - 数据源和数据提供程序的问题

  显示原文与译文双语对照的内容
0 0

我有以下测试用例:

include_once('../Logger.php');

class LoggerTest extends PHPUnit_Framework_TestCase {

    public function providerLogger() {
        return new Logger;
    }

    /**
     * @dataProvider providerLogger
     */
    public function testAddStream($logger) {
        $this->assertTrue(false);
    }

}

我PHPUnit来运行测试时,出现:

PHPUnit 3.4.14 by Sebastian Bergmann.

..........

Time: 0 seconds, Memory: 5.75Mb

OK (1 tests, 0 assertions)

测试,但它不应该失败。 我试过有:

public function providerLogger() {
    return array(new Logger);
}

其实我知道:

The data provider specified for LoggerTest::testAddStream is invalid.

我试过声明变量, static( 就像手册上说),但仍没有区别。

我记得以前让其工作方式是相似的,但我可能错了, 我错过了什么?

提前感谢你的帮助。

PHPUnit 3 .4 .14 ( 摘自PEAR ) 在PHP 5 .3 .3

时间: 原作者:

0 0

提供者必须如下所示。

public static function providerLogger() {
    return array(
      array(new Logger)
    );
}

一上来就是: 该方法必须静态

数组 s 很重要。 它不是那么难以理解。 外部数组有一个值每次迭代测试应该得到调用。 这里就能这么调用一次。 内部数组是( 按顺序) 的参数测试调用时,。 测试要求只有一个参数,所以内部数组必须始终只返回一个值。 另外一个小示例

public static function addTestProvider () {
    return array(
        /* First + Second = third? */
        array(1,4,5),
        array(3,3,6),
        array(5,5,6)
    );
)
public function testAdd ($a, $b, $result) {
    $this->assertEquals($result, $a + $b);
}

这里 testAdd 获取执行3 次,每遇到一个二级数组,它将接收内部 数组中的值s 。 你可能会发现,测试将失败,并为你提供一个消息,其中迭代数据集( 这里#3,因为5+5不是6,) ),则断言失败。

原作者:
0 0

我有同样的问题,也解决了,当我删除了空构造函数,that被自动生成。 iam不知道为什么这个问题就解决了 我也没有什么测试方法,与类版本。 provider方法不需要静态的,到目前为止我没有静态测试运行。 而且我对运行时提供程序方法static

0 0
<?php

require_once 'calculator.php';

/**
 * Calculator test case.
 */
class CalculatorTest extends PHPUnit_Framework_TestCase {

    /**
     * @var Calculator
     */
    private $Calculator;

    /**
     * Prepares the environment before running a test.
     */
    protected function setUp() {
        parent::setUp ();
        // TODO Auto-generated CalculatorTest::setUp()
        $this->Calculator = new Calculator(/* parameters */);
    }

    /**
     * Cleans up the environment after running a test.
     */
    protected function tearDown() {
        // TODO Auto-generated CalculatorTest::tearDown()
        $this->Calculator = null;
        parent::tearDown ();
    }

    /**
     * Constructs the test case.
     */
    public function __construct() {
        // TODO Auto-generated constructor
    }

    /**
     * Tests Calculator->add()
     *
         * @dataProvider provider
         */
    public function testAdd($a, $b, $c) {
        // TODO Auto-generated CalculatorTest->testAdd()
        //$this->markTestIncomplete ( "add test not implemented" );

        //$this->Calculator->add(/* parameters */);
        $this->assertEquals($this->Calculator->add($a, $b), $c);
    }

    public static function provider()
    {
        return array(
          array(1, 1, 1),
          array(1, 1, -1),
          array(4, 2, 2),
          array(1, 1, 1)
        );
    }
}

是一整套代码

原作者:
0 0

我也发现不能直接链数据提供程序:

class ProviderTest extends PHPUnit_Framework_TestCase {

    public function provider() {
        return array(array('test'));
    }

    /**
     * @dataProvider provider
     */
    public function providerTest1($test) {
        $this->assertTrue($test);
        return array(array($test));
    }

    /**
     * @dataProvider providerTest1
     */
    public function providerTest2($test) {
        $this->assertEquals('test', $test);
    }

}

很显然PHPUnit调用提供程序的所有功能运行任何测试之前,,可能根本没法使用单独的provider函数养活测试结果数据复制到其他测试。 你最快只能这样来模拟:

class ProviderTest extends PHPUnit_Framework_TestCase {

    private $provider_data = array();

    public function provider() {
        return array(array('test'));
    }

    /**
     * @dataProvider provider
     */
    public function testProvider1($test) {
        $this->assertFalse(empty($test));
        array_push($this->provider_data, array($test));
    }

    /**
     * @depends testProvider1
     */
    public function testProvider2($test = NULL) {
        if(is_null($test)) {
            // simulate a provider
            foreach($this->provider_data as $row) {
                call_user_func_array(array($this, __METHOD__), $row);
            }
        } else {
            $this->assertEquals('test', $test);
        }
    }

}
原作者:
0 0

删除参数来自公共函数testAddStream( $logger ) 然后再试一次。 我不相信PHPUnit将调用test这需要参数是无法通行。

原作者:
0 0

看吧我取得了一个模式来实现测试的依赖性dataProviders ! 这样可以链dataProviders 。

class ProviderDependencyTest extends PHPUnit_Framework_TestCase
{
    private static $dataSet;

    public function provideData()
    {
        self::$dataSet = array(
                    array(2,2,4),
                    array(1,0,2),
                    array(0,0,0)
                );

        //use static storage so you don't have to call the dataProvider again
        return self::$dataSet;
    }

    public function testProvideAdd()
    {
        $data = self::$dataSet;

        $this->assertEquals(3,count($data[0]));

        return $data[0];
    }

    /**
     * @depends testProvideAdd
     */
    public function testAdd($data)
    {
        $sum = $data[0] + $data[1];

        $this->assertEquals($data[2], $sum);

        return array($sum,$data[0],$data[1]);
    }

    /**
     * @depends testAdd
     */
    public function testSubtract($data)
    {
        $difference = $data[0] - $data[1];

        $this->assertEquals($data[2], $difference);

        return array($difference,$data[0],$data[1]);
    }

    /**
     * @depends testSubtract
     */
    public function testMultiply($data)
    {
        $product = $data[0] * $data[2];

        $this->assertEquals($data[1], $product);

        return $product;
    }

    /**
     * @depends testMultiply
     *
     * @dataProvider provideData
     */
    public function testMath($a,$b,$c)
    {
        //don't redo the first set of tests
        if(array($a,$b,$c) == self::$dataSet[0])
        {
            return;
        }

        $sum = $this->testAdd(array($a,$b,$c));
        $difference= $this->testSubtract($sum);
        $product = $this->testMultiply($difference);

        $this->assertInternalType('integer', $product);
    }
}

第二个数据集失败1 测试来说明。

原作者:
...