我可以集中相同但需要两个不同方法名称才能正常工作的代码吗?
Can I centralize code that's identical but needs two different method names to properly work?
在我的工作中,我需要从各种来源导入大量数据,这些数据往往会提供 "unclean" 信息(缺少字段、到处都是拼写错误,随便你怎么说)。因此,我构建了一个框架来自动执行各种验证,使数据适合生产。这个东西是内置在 PHP 中的,我从 PHPUnit 中获得了很多关于我的东西如何工作的灵感。这是我基本的一部分 class:
abstract class importUnitTest
{
public function __construct($nomTable, $conn, $niveauOutput = self::OUTPUT_ALL)
{
$this->nomTable = $nomTable;
$this->conn = $conn;
$this->testsReussis = true;
$this->niveauOutput = $niveauOutput;
$this->sql = "";
$methods = get_class_methods($this);
echo "<table class='tblUnitTest' id=\"unitTestResults\" border='1'>\n";
forEach($methods as $method)
{
if($method != '__construct' && preg_match("/^test/", $method))
{
$this->{$method}();
}
}
echo "</table>\n";
}
}
基本上,它所做的是,在实例化时,它将遍历我的 class 的每个方法并执行所有以 test 开头的方法。因此,当我有一种新类型的文件要测试时,我只需扩展一个 class 并将我的验证编码如下:
class FACT_UnitTests_BT_BC extends importUnitTest
{
public function test__Assureur__NotNullOrEmpty($actif = true)
{
$res1 = $this->champNotNull($this->getNomChamp(__FUNCTION__), $actif);
$res2 = $this->champNotEmpty($this->getNomChamp(__FUNCTION__), $actif);
if(!$actif)
$resultat = self::TEST_DESACTIVE;
else
$resultat = ($res1 == self::TEST_REUSSI && $res2 == self::TEST_REUSSI) ? self::TEST_REUSSI : self::TEST_ECHOUE;
$this->genererOutput($this->getNomTestCourant(__FUNCTION__), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
public function test__NoAssureur__NotNull($actif = true)
{
$resultat = $this->champNotNull($this->getNomChamp(__FUNCTION__), $actif);
$this->genererOutput($this->getNomTestCourant(__FUNCTION__), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
public function test__NoClient__NotNull($actif = true)
{
$resultat = $this->champNotNull($this->getNomChamp(__FUNCTION__), $actif);
$this->genererOutput($this->getNomTestCourant(__FUNCTION__), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
}
这一切都很完美,让我可以自动执行几乎所有我想要的验证。但是,您可能注意到方法 "NoAssureur__NotNull" 和 "NoClient__NotNull" 具有完全相同的代码。在正常情况下,相同的代码 = 相同的功能......但在这种特殊情况下,我需要函数名称才能正确确定我正在测试的字段(您可能猜到一个是 NoClient,另一个是 NoAssureur)。
最近,我在我的一个测试中发现了一个小错误......我不得不返回并在一百多个地方更正它(因为我显然是在复制粘贴)。这在维护方面是相当不可接受的。那么有没有更好的方法来处理事情呢?有没有办法集中相同的测试代码?
提前致谢,
奥苏
我会在摘要 class 中设置带有字段参数的测试代码,并在带有参数的子 class 中调用它。
类似这样的事情(省略了您的部分实际代码,并且有点不确定,因为我根本不知道您的其他方法在哪里):
abstract class importUnitTest
{
public function isNotNull($field,$actif) {
$resultat = $this->champNotNull($this->getNomChamp($field), $actif);
$this->genererOutput($this->getNomTestCourant($field), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
//[...] omitting existing code
}
class FACT_UnitTests_BT_BC extends importUnitTest
{
// Omission of actual code
public function test__NoAssureur__NotNull($actif = true)
{
$this->isNotNull(__FUNCTION__, $actif)
}
public function test__NoClient__NotNull($actif = true)
{
$this->isNotNull(__FUNCTION__, $actif)
}
}
我又想到了,我可能错了;)
在我的工作中,我需要从各种来源导入大量数据,这些数据往往会提供 "unclean" 信息(缺少字段、到处都是拼写错误,随便你怎么说)。因此,我构建了一个框架来自动执行各种验证,使数据适合生产。这个东西是内置在 PHP 中的,我从 PHPUnit 中获得了很多关于我的东西如何工作的灵感。这是我基本的一部分 class:
abstract class importUnitTest
{
public function __construct($nomTable, $conn, $niveauOutput = self::OUTPUT_ALL)
{
$this->nomTable = $nomTable;
$this->conn = $conn;
$this->testsReussis = true;
$this->niveauOutput = $niveauOutput;
$this->sql = "";
$methods = get_class_methods($this);
echo "<table class='tblUnitTest' id=\"unitTestResults\" border='1'>\n";
forEach($methods as $method)
{
if($method != '__construct' && preg_match("/^test/", $method))
{
$this->{$method}();
}
}
echo "</table>\n";
}
}
基本上,它所做的是,在实例化时,它将遍历我的 class 的每个方法并执行所有以 test 开头的方法。因此,当我有一种新类型的文件要测试时,我只需扩展一个 class 并将我的验证编码如下:
class FACT_UnitTests_BT_BC extends importUnitTest
{
public function test__Assureur__NotNullOrEmpty($actif = true)
{
$res1 = $this->champNotNull($this->getNomChamp(__FUNCTION__), $actif);
$res2 = $this->champNotEmpty($this->getNomChamp(__FUNCTION__), $actif);
if(!$actif)
$resultat = self::TEST_DESACTIVE;
else
$resultat = ($res1 == self::TEST_REUSSI && $res2 == self::TEST_REUSSI) ? self::TEST_REUSSI : self::TEST_ECHOUE;
$this->genererOutput($this->getNomTestCourant(__FUNCTION__), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
public function test__NoAssureur__NotNull($actif = true)
{
$resultat = $this->champNotNull($this->getNomChamp(__FUNCTION__), $actif);
$this->genererOutput($this->getNomTestCourant(__FUNCTION__), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
public function test__NoClient__NotNull($actif = true)
{
$resultat = $this->champNotNull($this->getNomChamp(__FUNCTION__), $actif);
$this->genererOutput($this->getNomTestCourant(__FUNCTION__), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
}
这一切都很完美,让我可以自动执行几乎所有我想要的验证。但是,您可能注意到方法 "NoAssureur__NotNull" 和 "NoClient__NotNull" 具有完全相同的代码。在正常情况下,相同的代码 = 相同的功能......但在这种特殊情况下,我需要函数名称才能正确确定我正在测试的字段(您可能猜到一个是 NoClient,另一个是 NoAssureur)。
最近,我在我的一个测试中发现了一个小错误......我不得不返回并在一百多个地方更正它(因为我显然是在复制粘贴)。这在维护方面是相当不可接受的。那么有没有更好的方法来处理事情呢?有没有办法集中相同的测试代码?
提前致谢,
奥苏
我会在摘要 class 中设置带有字段参数的测试代码,并在带有参数的子 class 中调用它。
类似这样的事情(省略了您的部分实际代码,并且有点不确定,因为我根本不知道您的其他方法在哪里):
abstract class importUnitTest
{
public function isNotNull($field,$actif) {
$resultat = $this->champNotNull($this->getNomChamp($field), $actif);
$this->genererOutput($this->getNomTestCourant($field), $resultat);
$this->testsReussis = ($this->testsReussis && ($resultat !== self::TEST_ECHOUE));
$this->sql = "";
}
//[...] omitting existing code
}
class FACT_UnitTests_BT_BC extends importUnitTest
{
// Omission of actual code
public function test__NoAssureur__NotNull($actif = true)
{
$this->isNotNull(__FUNCTION__, $actif)
}
public function test__NoClient__NotNull($actif = true)
{
$this->isNotNull(__FUNCTION__, $actif)
}
}
我又想到了,我可能错了;)