我正在编写测试用例,这是我的问题。
所以说我正在测试一个简单的函数someClass::loadValue($value)
正常的测试用例很简单,但假设在传入null或-1时,函数调用会生成一个PHP警告,这被认为是一个错误。
问题是,如何编写我的PHPUnit测试用例,以便在函数正常处理null / -1时成功,并在抛出PHP警告时失败?
谢谢,
答案 0 :(得分:36)
PHPUnit_Util_ErrorHandler::handleError()
根据错误代码抛出几种异常类型之一:
PHPUnit_Framework_Error_Notice
代表E_NOTICE
,E_USER_NOTICE
和E_STRICT
PHPUnit_Framework_Error_Warning
代表E_WARNING
和E_USER_WARNING
PHPUnit_Framework_Error
你可以捕捉并期望这些,就像你遇到的任何其他例外一样。
/**
* @expectedException PHPUnit_Framework_Error_Warning
*/
function testNegativeNumberTriggersWarning() {
$fixture = new someClass;
$fixture->loadValue(-1);
}
答案 1 :(得分:7)
对我有用的是将我的phpunit.xml修改为
<phpunit
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
strict="true"
>
</phpunit>
关键是使用strict="true"
来获取警告,导致测试失败。
答案 2 :(得分:7)
我会创建一个单独的案例来测试预期通知/警告的时间。
对于PHPUnit v6.0 +,这是最新语法:
use PHPUnit\Framework\Error\Notice;
use PHPUnit\Framework\Error\Warning;
use PHPUnit\Framework\TestCase;
class YourShinyNoticeTest extends TestCase
{
public function test_it_emits_a_warning()
{
$this->expectException(Warning::class);
file_get_contents('/nonexistent_file'); // This will emit a PHP Warning, so test passes
}
public function test_it_emits_a_notice()
{
$this->expectException(Notice::class);
$now = new \DateTime();
$now->whatever; // Notice gets emitted here, so the test will pass
}
}
答案 3 :(得分:3)
您还可以使用以下命令编写phpunit.xml文件(在测试目录上):
<phpunit
convertErrorsToExceptions="true"
convertNoticesToExceptions="false"
stopOnFailure="false">
</phpunit>
答案 4 :(得分:0)
使用Netsilik/BaseTestCase(MIT许可证),您可以直接测试触发的错误/警告,而无需将它们转换为异常:
composer require netsilik/base-test-case
测试E_USER_NOTICE
:
<?php
namespace Tests;
class MyTestCase extends \Netsilik\Testing\BaseTestCase
{
/**
* {@inheritDoc}
*/
public function __construct($name = null, array $data = [], $dataName = '')
{
parent::__construct($name, $data, $dataName);
$this->_convertNoticesToExceptions = false;
$this->_convertWarningsToExceptions = false;
$this->_convertErrorsToExceptions = true;
}
public function test_whenNoticeTriggered_weCanTestForIt()
{
$foo = new Foo();
$foo->bar();
self::assertErrorTriggered(E_USER_NOTICE, 'The warning string');
}
}
希望这对以后的人有帮助。
答案 5 :(得分:-2)
Make SomeClass在输入无效时抛出错误并告诉phpUnit预期错误。
一种方法是:
class ExceptionTest extends PHPUnit_Framework_TestCase
{
public function testLoadValueWithNull()
{
$o = new SomeClass();
$this->setExpectedException('InvalidArgumentException');
$this->assertInstanceOf('InvalidArgumentException', $o::loadValue(null));
}
}
有关更多方法,请参阅documentation。