我已阅读有关该主题的文档,我的代码遵循数据提供程序实现的所有要求.首先,这是测试的完整代码,以防它相关.
这是实现数据提供者的功能:
/**
* 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在注释的注释中引用它,但从不调用数据提供程序函数.
请解释原因
谢谢
方法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)
当然,这种方式与"旧"局部变量方式之间几乎没有区别.
简而言之一个问题:运行测试时phpunit可以使用多个数据提供程序吗?
例如,我有一个名为getById的方法,我需要为它运行成功和不成功的测试用例.
成功的测试用例意味着它可以返回相应的记录.对于不成功的输入,输入可以分为两类:无效和失败.
无效意味着输入不合法,而失败意味着输入可能有效,但没有相应的记录与该ID.
所以代码是这样的:
/**
* @dataProvider provideInvalidId
* @dataProvider provideFailedId
*/
public function testGetByIdUnsuccess($id)
{
$this->assertNull($this->model->getById($id));
}
Run Code Online (Sandbox Code Playgroud)
但事实证明,只使用了第一个数据提供者,而忽略了第二个数据提供者.虽然我不确定这种情况是否常见,但这是问题所在.我们可以使用多个数据提供商?如果我们可以,怎么样?
PS:在这里找不到太多帮助
http://four.laravel.com/docs/testing表示"安装新的Laravel应用程序后,只需phpunit在命令行上运行即可运行测试."
phpunit不认可,我也尝试过php artisian test和php artisan phpunit
是phpunit在一些奇怪的文件夹中,还是Laradvel实际上没有包含它?我不想安装它,如果它有两个.
我有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 final class但是因为它被声明final我一直收到这个错误:
PHPUnit_Framework_Exception: Class "Doctrine\ORM\Query" is declared "final" and cannot be mocked.
反正final是为了我的单元测试而不引入任何新框架来解决这种行为?
我正在尝试将一堆测试从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) 给出以下方法:
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一样 - 失败!).无论如何,如果他们失败了; 那些依赖它们的方法不会失败吗?
那么,代码覆盖怎么样?
我收到的错误很多,就像这个:
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 $buffer用if (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) 我尝试在我的新机器上运行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 ×10
phpunit ×10
unit-testing ×5
mocking ×2
accessor ×1
doctrine-orm ×1
laravel ×1
simpletest ×1
symfony ×1
tdd ×1
testing ×1
zend-session ×1