我开始学习如何使用 PHPUnit 来测试我正在开发的网站。我遇到的问题是我定义了五种不同的用户类型,并且我需要能够使用不同类型测试每个类。我目前有一个用户类,我想将其传递给每个函数,但我不知道如何传递它或测试可能返回的正确或不正确的不同错误。

编辑: 我应该说的。我有一个用户类,我想将此类的不同实例传递给每个单元测试。

有帮助吗?

解决方案

如果您的各种用户类继承自父用户类,那么我建议您对测试用例类使用相同的继承结构。

考虑以下示例类:

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

您可以对测试用例类执行以下操作:

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

因为每个测试都依赖于您可以重写的创建方法,并且因为测试方法是从父测试类继承的,所以父类的所有测试都将针对子类运行,除非您重写它们以更改预期行为。

以我有限的经验来看,这非常有效。

其他提示

如果您想测试实际的 UI,您可以尝试使用 Selenium (www.openqa.org) 之类的东西。它允许您用 PHP 编写代码(我假设它可以与 phpUnit 一起使用)来驱动浏览器。

另一种方法是拥有一个通用方法,每个测试都可以针对不同的用户类型调用该方法。即,类似“ValidatePage”的东西,然后您可以从 TestAdminUser 或 TestRegularUser 调用它,并让该方法简单地执行与您期望的相同的基本验证。

只要确保您没有遇到 反模式 这里。也许您在构造函数中做了太多工作?或者也许这些实际上应该是不同的类?测试通常会为您提供以下线索: 代码的设计。 听他们说。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top