gpt4 book ai didi

php - 在 PHPunit 中测试异常总是失败

转载 作者:可可西里 更新时间:2023-11-01 13:40:17 27 4
gpt4 key购买 nike

我在 PHP 中有一些自定义异常:

class MainException extends Exception {};
class ExceptionOne extends MainException {};
class ExceptionTwo extends MainException {};

我在类里面通过两种简单的方法使用它们:

public function firstFunction($param) {
if ($some_condition) {
// do whatever
} else {
throw new ExceptionOne();
}
}

public function secondFunction($param) {
if ($some_condition) {
// do whatever
} else {
throw new ExceptionTwo();
}
}

我还有一个针对这两个异常的 PHPUnit 测试,类似于:

public function testFirstException() {
try {
// anything
} catch (Exception $e) {
$this->assertType('ExceptionOne', $e);
$this->assertType('MainException', $e);
}
}
public function testSecondException() {
try {
// anything
} catch (Exception $e) {
$this->assertType('ExceptionTwo', $e);
$this->assertType('MainException', $e);
}
}

如果我在浏览器中测试我的类并故意让我的函数失败(使用与 PHPUnit 测试相同的东西),我可以看到 ExceptionOneExceptionTwo 在需要时被引发。然而,当我用 PHPUnit 测试它时,我总是失败:

1) testSecondException(SomeTest)
Failed asserting that <PHPUnit_Framework_ExpectationFailedException> is an instance of class "ExceptionTwo".
C:\test.php:67

第67行是
$this->assertType('ExceptionTwo', $e);
无论我尝试什么,它都会在这里失败。我很确定我在 secondFunction 中的条件是正确的。第一个测试 (testFirstException) 运行完美,我从来没有像第二个那样失败。
我想补充一点,我不应该在这里更改 PHPUnit 测试!

我做错了什么??

最佳答案

从您对 cbuckley 的出色回答的评论来看,测试似乎是这样编写的:

public function testFirstException() {
try {
// some code that is supposed to throw ExceptionOne
$this->assertTrue(false, "Test failed");
} catch (Exception $e) {
$this->assertType('ExceptionOne', $e);
$this->assertType('MainException', $e);
}
}

assertTrue 用于确保在测试期间未抛出异常时测试失败。但是,这不起作用,因为失败的断言会引发不同的异常类型,这会导致错误消息令人困惑。

Failed asserting that <PHPUnit_Framework_ExpectationFailedException> 
is an instance of class "ExceptionOne".

您可以使用 @expectedExceptionsetExpectedException 解决此问题。不仅在抛出 ExceptionOne 时测试会通过,而且在未抛出或抛出其他异常类型时测试也会失败。

/**
* @expectedException ExceptionOne
*/
public function testFirstException() {
// some code that is supposed to throw ExceptionOne
}

当没有抛出异常时,错误信息是

Failed asserting that exception of type "ExceptionOne" is thrown.

当抛出不同类型的异常时你会看到

Failed asserting that exception of type "Exception" matches
expected exception "RuntimeException".

这种测试异常的方法是

  • 更容易写,
  • 更易于阅读,
  • 当测试失败时更容易调试,
  • 并改正。

关于php - 在 PHPunit 中测试异常总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13198392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com