我可以集中相同但需要两个不同方法名称才能正常工作的代码吗?

时间:2015-01-23 15:10:51

标签: php class repeat

在我的工作中,我需要从各种来源导入大量数据,这些数据倾向于给出“不洁净”的信息。信息(缺少字段,到处都是拼写错误,你可以命名)。因此,我已经构建了一个框架来自动化各种需要进行的验证,以使数据适合生产。这个东西是用PHP构建的,我从PHPUnit中获取了很多关于我的东西如何工作的灵感。这是我基础班的一部分:

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";
    }
}

基本上,它的作用是,在实例化时,它会遍历我的类的每个方法并执行所有那些以test开头的方法。所以,当我有一个要测试的新类型的文件时,我只是扩展一个类并编写我的验证代码如下:

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 = "";
    }
}

这一切都很完美,并且允许我自动完成我想要的任何验证。但是,您可能已经注意到方法&#34; NoAssureur__NotNull&#34;和&#34; NoClient__NotNull&#34;拥有完全相同的代码。在正常情况下,相同的代码=相同的功能......但在这种特殊情况下,我需要函数名称才能正确确定我测试的字段(因为你可能猜到一个是NoClient和另一个NoAssureur )。

最近,我在我的一次测试中发现了一个小错误......我不得不回过头来纠正它超过一百个地方(因为我显然是复制粘贴)。这是相当不可接受的维护方式。那么有更好的办法吗?有没有办法集中测试代码相同?

提前致谢,

大须

1 个答案:

答案 0 :(得分:1)

我会使用field参数在抽象类中设置测试代码,并使用参数在子类中调用它。

这样的事情(部分实际代码被忽略了,有点不确定,因为我不知道你在哪里以及其他方法):

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)
    }
}

再一次,这是我的头脑,我可能是错的;)