标签: phpunit

PHPUnit @dataProvider根本不起作用

我已阅读有关该主题的文档,我的代码遵循数据提供程序实现的所有要求.首先,这是测试的完整代码,以防它相关.

这是实现数据提供者的功能:

/**
 * Test the createGroup function
 *
 * @return void
 * @author Tomas Sandven <tomas191191@gmail.com>
 *
 * @dataProvider provideFileImportTests_good
 **/
public function testCreateGroup($file, $groupname, $group, $mapping)
{
    // Create a test group
    $id = $this->odm->createGroup($groupname, $group);

    // Try to load it back out
    $result = R::load(OmniDataManager::TABLE_GROUP, $id);

    // Check that the result is not null
    $this->assertFalse(is_null($result));

    return $id;
}
Run Code Online (Sandbox Code Playgroud)

PHPUnit失败了:

缺少参数1 for tests\broadnet\broadmap\OmniDataManagerTest :: testCreateGroup()

我试过杀死die();数据提供程序函数中的application(),它永远不会发生.数据提供程序函数在同一个类中公开可用,函数名中没有拼写错误,函数testCreateGroup在注释的注释中引用它,但从不调用数据提供程序函数.

请解释原因

谢谢

php phpunit

28
推荐指数
5
解决办法
9829
查看次数

关于如何在PHPUnit中使用setUp()和tearDown()的真实单词示例?

方法setUp()tearDown()在每次测试之前和之后调用.但是,真的,有什么真正的单词示例关于我为什么需要这个?

检查其他人的测试,我总是看到类似的东西:

public function setUp()
{
    $this->testsub = new TestSubject();
}

public function tearDown()
{
    unset($this->testsub);
}

public function testSomething()
{
    $this->assertSame('foo', $this->testsub->getFoo());
}
Run Code Online (Sandbox Code Playgroud)

当然,这种方式与"旧"局部变量方式之间几乎没有区别.

php testing phpunit unit-testing

28
推荐指数
1
解决办法
3万
查看次数

phpunit可以使用多个数据提供程序

简而言之一个问题:运行测试时phpunit可以使用多个数据提供程序吗?

例如,我有一个名为getById的方法,我需要为它运行成功和不成功的测试用例.

成功的测试用例意味着它可以返回相应的记录.对于不成功的输入,输入可以分为两类:无效和失败.

无效意味着输入不合法,而失败意味着输入可能有效,但没有相应的记录与该ID.

所以代码是这样的:

/** 
 * @dataProvider provideInvalidId
 * @dataProvider provideFailedId
 */
public function testGetByIdUnsuccess($id)
{   
    $this->assertNull($this->model->getById($id));
}   
Run Code Online (Sandbox Code Playgroud)

但事实证明,只使用了第一个数据提供者,而忽略了第二个数据提供者.虽然我不确定这种情况是否常见,但这是问题所在.我们可以使用多个数据提供商?如果我们可以,怎么样?

PS:在这里找不到太多帮助

php tdd phpunit unit-testing

28
推荐指数
4
解决办法
9421
查看次数

Laravel 4测试; "phpunit"无法识别?

http://four.laravel.com/docs/testing表示"安装新的Laravel应用程序后,只需phpunit在命令行上运行即可运行测试."

phpunit不认可,我也尝试过php artisian testphp artisan phpunit

phpunit在一些奇怪的文件夹中,还是Laradvel实际上没有包含它?我不想安装它,如果它有两个.

php phpunit laravel

28
推荐指数
1
解决办法
2万
查看次数

如何在功能测试中模拟Symfony 2服务?

我有symfony服务,它在某些方法中使用redis连接,但在所有方法中都没有.

class ServiceA
{
    private $redis;

    public function __construct($redis)
    {
        $this->redis = $redis;
    }

    public function getRequest($param1, $param2)
    {
    $result = $param1+ $param2;
        return $request;
    }

    .. other methods which use $redis connection
}
Run Code Online (Sandbox Code Playgroud)

我正在为仅使用getRequest方法的代码编写功能测试(此方法不需要redis连接),但是当构造函数将连接作为参数时,当我运行test时,它尝试连接redis服务器.

如何编写完全不使用redis连接的模拟服务并忽略原始构造函数.

我正在尝试下面提到的方法,但没有成功.我仍然尝试连接redis,尽管我已经禁用了原始构造函数.

http://blog.lyrixx.info/2013/04/12/symfony2-how-to-mock-services-during-functional-tests.html

$serviceA = $this->getMockBuilder('ServiceA')
    ->disableOriginalConstructor()
    ->getMock();

static::$kernel->getContainer()->set('my_bundle.service.a', $serviceA);
Run Code Online (Sandbox Code Playgroud)

php phpunit unit-testing mocking symfony

28
推荐指数
2
解决办法
3万
查看次数

PHP模拟最终类

我试图模拟一个PHP final class但是因为它被声明final我一直收到这个错误:

PHPUnit_Framework_Exception: Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.

反正final是为了我的单元测试而不引入任何新框架来解决这种行为?

php phpunit unit-testing mocking doctrine-orm

28
推荐指数
6
解决办法
1万
查看次数

PHPUnit中的SimpleTest"部分模拟"的等价物?

我正在尝试将一堆测试从SimpleTest迁移到PHPUnit,我想知道是否有一个等效的SimpleTest的部分模拟.

更新:我似乎无法在文档中找到任何暗示此功能可用的内容,但我想到我可以使用子类.这是一个好主意还是坏主意?

class StuffDoer {
    protected function doesLongRunningThing() {
        sleep(10);
        return "stuff";
    }
    public function doStuff() {
        return $this->doesLongRunningThing();
    }
}
class StuffDoerTest {
    protected function doesLongRunningThing() {
        return "test stuff";
    }
}
class StuffDoerTestCase extends PHPUnit_Framework_TestCase {
    public function testStuffDoer() {
        $sd = new StuffDoerTest();
        $result = $sd->doStuff();
        $this->assertEquals($result, "test stuff");
    }
}
Run Code Online (Sandbox Code Playgroud)

php phpunit simpletest

27
推荐指数
3
解决办法
2万
查看次数

单元测试访问器(getter和setter)

给出以下方法:

public function setFoo($foo) {
    $this->_foo = $foo;
    return $this;
}

public function getFoo() {
    return $this->_foo;
}
Run Code Online (Sandbox Code Playgroud)

假设,未来可能会更改为更复杂:

  • 你会如何为这些方法编写单元测试?
  • 只有一种测试方法?
  • 我应该跳过这些测试吗?
  • 代码覆盖怎么样?
  • @covers注释怎么样?
  • 也许在抽象测试用例中实现一些通用的测试方法?

(我使用Netbeans 7)

这似乎是浪费时间,但我不介意IDE是否会自动生成这些测试方法.

要从塞巴斯蒂安·伯格曼博客的评论中获得评论:

(就像测试getter和setter一样 - 失败!).无论如何,如果他们失败了; 那些依赖它们的方法不会失败吗?

那么,代码覆盖怎么样?

php phpunit unit-testing accessor getter-setter

27
推荐指数
2
解决办法
9779
查看次数

PHPUnit输出导致Zend_Session异常

我收到的错误很多,就像这个:

Zend_Session_Exception: Session must be started before any output has been sent to the browser; output started in /usr/local/zend/share/pear/PHPUnit/Util/Printer.php/173
Run Code Online (Sandbox Code Playgroud)

运行我的应用程序的测试套件时.这是PHPUnit 3.5.10和PHP 5.3.5.

没有神秘的,意外的空白输出导致这种情况.我已经确定"发送到浏览器的输出"是正在执行的PHPUnit测试的实际输出.如果我打开PHPUnit/Util/Printer.php并print $bufferif (strpos($buffer, 'PHPUnit 3.5.10 by Sebastian Bergmann') === false)(包括从PHPUnit中有效地停止输出的第一行)包装该行,那么我的第一个测试成功(直到测试用例输出一个指示测试成功的点,然后是下一个测试失败,因为输出了点).

我团队中的另一位开发人员能够成功运行完整的测试套件,因此我知道这不是应用程序代码的问题.它必须是我的本地环境的一些配置设置或问题.

我已经检查过php.ini来验证是否output_buffering已打开并implicit_flush关闭,它们是.

我也尝试添加Zend_Session::$_unitTestEnabled = true;到我的测试引导程序,但这没有帮助(并且不应该是必要的,因为它适用于另一个开发人员的机器和我们的CI服务器上没有它).

除了忽略错误之外的任何建议?我从来没有见过这样的东西,我真的很茫然.

谢谢!

更新:

为了尝试进一步隔离问题,我通过执行以下测试脚本将ZF和我的应用程序排除在外:

<?php

class SessionTest extends PHPUnit_Framework_TestCase
{
    public function testSession()
    {
        session_start();
        $this->assertTrue(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试失败:

1) SessionTest::testSession
session_start(): Cannot send session cookie - headers already sent by (output started …
Run Code Online (Sandbox Code Playgroud)

php phpunit zend-framework zend-session

27
推荐指数
2
解决办法
7081
查看次数

致命错误 - 打开的文件太多

我尝试在我的新机器上运行PHPUnit测试,我收到此错误:

PHP致命错误:带有消息'RecursiveDirectoryIterator :: __ construct(/ usr/lib/php/pear/File/Iterator)的未捕获异常'UnexpectedValueException':无法打开dir:/ usr/lib/php/pear中的打开文件过多/File/Iterator/Factory.php:114

旧机器上的相同代码运行良好......

新机器环境:PHP版本:PHP 5.3.21(cli)旧版本:PHP 5.3.14

每次PHPUnit输出:

................EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 65 / 66 ( 98%)
E

Time: 34 seconds, Memory: 438.50Mb

There were 50 errors:

1) XXXXXXXXXXX
PHP Fatal error:  Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/usr/lib/php/pear/File/Iterator): failed to open dir: Too many open files' in /usr/lib/php/pear/File/Iterator/Factory.php:114
Run Code Online (Sandbox Code Playgroud)

php phpunit

26
推荐指数
3
解决办法
4万
查看次数