我有一个执行以下任务的PHPUnit测试:
我的问题是我的测试随机失败,因为我没有等待发送电子邮件。在这个情况下,你会怎么做?
我收到了这个错误
Fatal error: Call to a member function hasResource() on a non-object in D:\Projects\Tickle\application\controllers\ErrorController.php on line 53
第53行看起来像
if (!$bootstrap->hasResource('Log')) {
Run Code Online (Sandbox Code Playgroud)
这似乎是$this->getInvokeArg('bootstrap')回归null.我没有其他错误.我在其他地方读到另一个问题,可能会引发异常,重置我的控制器或引导程序或类似的东西.是否有可能不显示该例外?甚至在PHP错误日志中?
我当前的设置看起来像
单个测试运行正常,但我仍然遇到错误
D:\Projects\Tickle\tests>phpunit
PHPUnit 3.5.5 by Sebastian Bergmann.
.
Fatal error: Call to a member function hasResource() on a non-object in D:\Projects\Tickle\application\controllers\Error
Controller.php on line 53
Run Code Online (Sandbox Code Playgroud) 我有一台MacBook Pro,安装了PEAR,安装了PHPUnit,所以在命令行我可以输入phpunit,我得到了使用帮助.
现在我想进行测试,以便我可以从那里进行构建.
我有一个index.php以此内容命名的文件:
<?php
require_once '?????';
class Product {
protected $id;
public function __construct($id)
{
$this->id = $id;
}
public function get_id()
{
return $this->id;
}
}
class ProductTest extends PHPUnit_Framework_TestCase
{
function testBasis()
{
$instance = new Product(1);
$this->assertInstanceOf('Product',$instance);
$this->assert($instance->get_id(), 1);
}
}
Run Code Online (Sandbox Code Playgroud)
在命令行中,我想转到文件所在的目录,并输入如下内容:
phpunit ?????
Run Code Online (Sandbox Code Playgroud)
接下来的步骤是什么,以便我能够从命令行使用PHPUnit测试上面的类?
我有一个基于Zend Framework的应用程序,我试图使用phpunit为测试用例生成骨架.Phpunit似乎无法找到我要为其生成的类的父类:
phpunit --skeleton-test Default_Model_Person ../application/models/Person.php
PHPUnit 3.5.11 by Sebastian Bergmann.
PHP Fatal error: Class 'X1_Db_Table_Auditable' not found in /path/to/application/models/Person.php on line 3
Fatal error: Class 'X1_Db_Table_Auditable' not found in /path/to/application/models/Person.php on line 3
Run Code Online (Sandbox Code Playgroud)
所以我有例如application/models/Person.php
<?php
class Default_Model_Person extends X1_Db_Table_Auditable
{
Run Code Online (Sandbox Code Playgroud)
在library/X1/Db/Table/Auditable.php中
<?php
class X1_Db_Table_Auditable extends X1_Db_Table
{
...
Run Code Online (Sandbox Code Playgroud)
我有其他手工编写的测试用例,phpunit可以在这个应用程序上运行而没有问题.我也尝试使用--bootstrap指定bootstrap文件,使用--configuration指定config以确保找到库的路径,但我似乎无法使其工作(结果与以上).如何让phpunit找到这个库类来生成骨架?
我是PHP,phpUnit和Zend的新手,所以请原谅我的初学者问题;)在此先感谢!
我正在使用PHPUnit开始一个TDD项目,这真的让我很烦恼.
只要不实现所有类和方法,似乎所有测试都无法运行.如果尚未实现类或方法,如何进行测试继续事件?
谢谢.
编辑:"在编写测试时,测试套件是否失败,这不是TDD的重点吗?" 是的,当然,但我希望全球范围内看到这个项目.假设我们已经编写了1000个测试,并且第一个运行会产生致命的错误.但是,当我们来实现代码时,我们并不幸运,那部分将是最后实现的部分之一.我不想开发"盲目",只有当所有致命错误都被清除时才能运行我的测试套件.
所以,是的,他们的失败测试与整个测试过程之间的巨大差异因为在这种状态下正常的致命错误而停止/死亡.
作为一个工作环节,我们在开始编写测试之前创建了类骨架.
我想测试一下我放在一起的自定义错误处理类,但这本身就带来了一些问题.
首先,由于在测试中设置自定义error_handler会覆盖PHPUnits error_handling,每次将其更改为自定义实现并进行测试时,必须调用restore_error_handler(),以便以后的测试使phpunits error_handling.虽然我承认没有尝试过,但是每次测试后PHPUnit都会重置自己,我有点怀疑它.
我有各种配置来测试,在不同的条件下,即E_ERROR,E_WARNING等.
然后我有了嘲笑error_handler的想法,但在模拟测试方面仍然很绿.一个快速的谷歌搜索让我找到了类似的方法,这里的想法修改和实施的方式可能适合我的需要...
//Create mock with error_handler method
$errorH = $this->getMock ('ErrorHandler', array ('error_handler'));
// error handler should be called at least once
$errorH->expects ($this->atLeastOnce())->method ('error_handler');
// Mock will need to be configured (here?) and tested
// against specific error_handling settings
// not implemented yet nor needed for this post.
//set mock as error handler for duration of this test
set_error_handler (array($errorH, 'error_handler'));
//test current mock error handler configuration
// for different conditions-> NOTICE / …Run Code Online (Sandbox Code Playgroud) 在我的TDD项目中,我试图在抽象类中测试一个方法.
abstract class Database_Mapper_Abstract
{
public function setTable($sTablename){
return('foo');
}
}
Run Code Online (Sandbox Code Playgroud)
这是我编写简单测试的方式:
public function testCanSetTable(){
$oMock = $this->getMockForAbstractClass('JCMS_Database_Mapper_Abstract');
$oMock->expects($this->once())
->method('setTable')
->with($this->equalTo('foo'))
->will($this->returnValue('foo'));
$this->assertEquals('foo',$oMock->setTable());
}
Run Code Online (Sandbox Code Playgroud)
当我运行此测试时,我收到以下错误:
Sebastian Bergmann的PHPUnit 3.5.13.
Ë
时间:1秒,内存:6.75Mb
有1个错误:
1)Database_Mapper_AbstractTest :: testCanSetTable缺少Database_Mapper_Abstract :: setTable()的参数1,在第15行的K:\ xampp\htdocs\tests\library\Database\Mapper\Abstract.php中调用并定义
K:\ xampp\htdocs\library\Database\Mapper\Abstract.php:4 K:\ xampp\htdocs\tests\library\Database\Mapper\Abstract.php:15
FAILURES!测试:1,断言:0,错误:1.
我理解这一点的方法是它无法找到setTable函数的参数.但我用这个with()方法设置它.我也试过了with('foo').这对我也没有帮助.
有没有人有想法?
我找不到任何匹配方法sfTestFunctional或sfBrowser设置UserAgent字符串.也许这是不可能的,因为它通过php-cli?
我的代码中有一个断言.就像是:
assert('is_string($var)');
Run Code Online (Sandbox Code Playgroud)
如果我为PHPUnit编写测试导致此断言失败并显示消息, Warning: assert(): Assertion "is_string($var)" failed in /path/to/file.php on line ###
而且,我的测试也失败了.我已经尝试根据文档添加@expectedException PHPUnit_Framework_Error_Warning到docblock ,但这没有帮助.我需要做些什么来使我的测试期望这个断言会失败?
我的测试运行得很慢......我的测试不到100次,但在快速机器上运行仍需要10秒钟.我尝试禁用代码覆盖,并使用缓存来处理远程服务器(例如LDAP)所做的一些事情.
在PHPUnit运行时分析测试产生:

完全10%的运行时间 - 包括收集信息和生成大量代码覆盖页面的时间 - 花费在mysqli->prepare.不幸的是,我不能在这里抽象数据库.我不仅有效地测试数据库访问层本身,还有很多逻辑是JOIN根据被测代码中的s 实现的.
是否有任何可以更改的配置设置或任何此类性质的设置以使其更快?是否prepare需要调用mysql服务器(因此设置本地mysql服务器进行测试可能有帮助?)
phpunit ×10
php ×8
unit-testing ×5
assert ×1
assertions ×1
doctrine-orm ×1
email ×1
imap ×1
lime ×1
mysqli ×1
performance ×1
symfony1 ×1
tdd ×1
undefined ×1
zend-test ×1