【问题标题】:How to test if a helper function was called inside a class method?如何测试是否在类方法中调用了辅助函数?
【发布时间】:2018-03-17 03:38:09
【问题描述】:

假设我正在 PHPUnit 中测试以下类:

class ExampleClass
{
    public function exampleMethod()
    {
        exampleHelperfunction('firstArg', 'secondArg');
    }
}

如何测试在运行exampleMethod 时是否使用参数'firstArg''secondArg' 调用了exampleHelperFunction

换句话说,我如何模拟不是类方法的函数?

【问题讨论】:

  • 希望你知道你正在混合 oop 和程序
  • 哦,是的,我是。谢谢。
  • 哦,好吧,这听起来让我毛骨悚然。玩得开心
  • 只是想知道,当您说要模拟exampleHelperfunction时,这意味着它无法在测试环境中执行吗?
  • @B001 我正在尝试围绕程序 API 编写一个包装器。因此,在某些时候,我需要测试该程序代码是否按预期运行。

标签: php unit-testing testing phpunit


【解决方案1】:

根据您的代码设置方式,您可以“模拟”该功能。如果您的代码使用命名空间,您可以利用 PHP 查找要调用的正确函数的方式。

https://www.schmengler-se.de/en/2011/03/php-mocking-built-in-functions-like-time-in-unit-tests/

如果您将测试放置在与代码相同的命名空间中,则可以将辅助函数替换为您可以控制的不同函数。

你希望你的班级喜欢这样的东西:

namespace foo;

class SUT {
     public function methodToTest() {
         exampleHelperFunction();
     }
 }

那么你可以像这样进行测试:

namespace foo;

function helperFunction() {
    //Check parameters and things here.
}

class SUTTest extends PHPUnit_Framework_Testcase {
    public function testMethodToTest() {
        $sut = new SUT();
        $sut->methodToTest();
    }
}

如果帮助函数没有在调用中指定其命名空间(即/helperFunction),则此方法有效。 PHP 将在函数的直接命名空间中查找,如果没有找到,则转到全局命名空间。因此,将测试放在与您的类相同的名称空间中,您可以在单元测试中替换它。

检查参数或更改返回值可能很棘手,但您可以利用测试用例中的一些静态属性来检查。

namespace foo;

function helperFunction($a1) {
    SUTTest::helperArgument = $a1;
    return SUTTest:helperReturnValue;
}

class SUTTest extends PHPUnit_Framework_Testcase {
    public static $helperArgument;
    public static $helperReturnValue;

    public function testMethodToTest() {
        self::helperReturnValue = 'bar';
        $sut = new SUT();
        $result = $sut->methodToTest('baz');

        $this->assertEquals(self::helperReturnValue, $result);
        $this->assertEquals(self::helperArgument, 'bar');
    }
}

如果您没有在代码中使用命名空间,则根本无法模拟该函数。您需要让您的测试代码使用实际功能并在您的类中检查结果。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2011-06-28
    • 2012-04-22
    • 2014-12-28
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多