phpunit静态调用方法中的方法

时间:2017-03-17 09:47:35

标签: php unit-testing testing phpunit processwire

我有这个方法:

public function getLocale()
    {
        $languageId = $this->_user->language->id;
        $page = Wire::getModule('myModule')->getPage($languageId);
        $locale = $page->locale;

        if (!!$locale) {
            return $locale;
        }

        // fallback to browser's locale
        $browserLocale = new SBD_Language();
        $locale = $browserLocale->getLanguageLocale('_');

        return $locale;
    }

现在我想为它编写一个测试,但是我收到了这个错误: 由Trying to get property of non-object引起的Wire::getModule('myModule')

所以我想用phpunit覆盖Wire::getModule响应。我只是不知道该怎么做。

到目前为止,我已经在方法getLocale放置的类中创建了一个模拟,并且这一切都正常但是我怎么告诉模拟类它实际上应该调用{{1的模拟class?

1 个答案:

答案 0 :(得分:1)

你可以通过代理对静态方法的调用来实现模拟静态方法,就像这样

class StaticClass
{
    static function myStaticFunction($param)
    {
        // do something with $param...
    }
}

class ProxyClass
{
    static function myStaticFunction($param)
    {
        StaticClass::myStaticFunction($param);
    }
}

class Caller
{
    // StaticClass::myStaticFunction($param);
    (new ProxyClass())->myStaticFunction($param); 
    // the above would need injecting to mock correctly
}

class Test
{
    $this->mockStaticClass = \Phake::mock(ProxyClass::class);
    \Phake::verify($this->mockStaticClass)->myStaticMethod($param);
}

该示例适用于Phake,但它应该以相同的方式与PHPUnit一起使用。