gpt4 book ai didi

php - 如何在函数调用后强制计算作为函数参数给出的表达式?

转载 作者:行者123 更新时间:2023-11-28 20:08:21 25 4
gpt4 key购买 nike

我正在编写自己的测试类。我遇到的问题是测试一个正在测试的函数是否抛出预期的异常。

我知道我可以做这样的事情:

try{
tested_function($expression->beingTestedThatWillThrowAnException());
}catch ($exception){
if($exception instanceof MyExpectedException){
echo 'OK';
} else {
echo 'FAILED';
}
}

但我希望我不必每次都编写所有这些 try ... catch block ,所以我想将它放在测试类方法中。

但是当我做这样的事情时

class Tester {
/**
* @param mixed expression to evaluate
* @param string expected exception class name
*/
public function assertException($expression, $expectedException){
try{
$expression;
} catch ($ex) {
if(is_subclass_of($ex, $expectedException)){
echo 'OK';
} else {
echo 'FAILED';
}
}

这失败了,因为 $expression 在方法调用的那一刻被评估,所以在程序进入 try block 之前。

我尝试的另一种方法是使用 eval 并将 $expression 作为字符串传递:

class Tester {
/**
* @param string expression to evaluate
* @param string expected exception class name
*/
public function assertException($expression, $expectedException){
try{
eval($expression);
} catch ($ex) {
if(is_subclass_of($ex, $expectedException)){
echo 'OK';
} else {
echo 'FAILED';
}
}

这没问题,但它不允许我使用主作用域中的变量,因此例如这一行失败 $test->assertException('$d->divideBy(0);'); 因为我在 Tester::assertException() 范围内没有 $d 变量。

我应该将所有可能的变量名声明为全局变量名吗?

我怎样才能强制在一个方法中计算表达式(或以其他方式达到预期的结果)?

我知道有现成的单元测试器(PHPUnit、SimpleTest 等),但我想自己做。

最佳答案

您可以将匿名函数(闭包)作为 $expression 传递,并使用 use 关键字将任何变量绑定(bind)到它 - http://php.net/manual/en/functions.anonymous.php

抱歉英语不好,我希望它是可以理解的。

关于php - 如何在函数调用后强制计算作为函数参数给出的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32875229/

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