【问题标题】:Creating mock Objects in PHP unit在 PHP 单元中创建模拟对象
【发布时间】:2010-11-19 00:51:02
【问题描述】:

我已经搜索过,但找不到我正在寻找的内容,并且手册在这方面没有太大帮助。我对单元测试相当陌生,所以不确定我是否走在正确的轨道上。无论如何,关于这个问题。我有一堂课:

<?php
    class testClass {
        public function doSomething($array_of_stuff) {
            return AnotherClass::returnRandomElement($array_of_stuff);
        }
    }
?>

现在,显然我希望 AnotherClass::returnRandomElement($array_of_stuff); 每次都返回相同的内容。我的问题是,在我的单元测试中,如何模拟这个对象?

我尝试将AnotherClass 添加到测试文件的顶部,但是当我想测试AnotherClass 时,我收到“无法重新声明类”错误。

我想我了解工厂类,但我不确定在这种情况下如何应用它。我是否需要编写一个完全独立的包含测试数据的 AnotherClass 类,然后使用 Factory 类而不是真正的 AnotherClass 来加载它?或者使用工厂模式只是一个红鲱鱼。

我试过这个:

    $RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils');

    $o1 = new stdClass();
    $o1->id = 2;
    $o1->test_id = 2;
    $o1->weight = 60;
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1";
    $RedirectUtils_stub->expects($this->any())
         ->method('chooseRandomRoot')
         ->will($this->returnValue($o1));
    $RedirectUtils_stub->expects($this->any())
         ->method('decodeQueryString')
         ->will($this->returnValue(array()));

在 setUp() 函数中,但这些存根被忽略,我无法确定这是我做错了什么,还是我访问 AnotherClass 方法的方式。

帮助!这让我发疯了。

【问题讨论】:

    标签: php unit-testing mocking phpunit


    【解决方案1】:

    使用单元测试,您希望创建包含静态数据的“测试”类,然后将它们传递给您的测试类。这会从测试中删除变量。

    class Factory{
        function build()
        {
            $reader = new reader();
            $test = new test($reader);
            // ..... do stuff
        }
    
    }
    
    class Factory{
        function build()
        {
            $reader = new reader_mock();
            $test = new test($reader);
            // ..... do stuff
        }
    
    }
    class reader_mock
    {
        function doStuff()
        {
            return true;
        }
    }
    

    因为您使用的是静态类,您必须从程序中删除AnotherClass,然后重新创建它,以便它只包含返回测试数据的函数。不过,通常情况下,您并不想真正从程序中删除类,这就是为什么您要像上面的示例那样传递类。

    【讨论】:

    • 太棒了,感谢您的回复。不过有一个问题;所以,我有一个我的工厂类,它为我创建了所有实例。这是进入生产的类。我是将模拟对象的东西添加到这个类中,还是我只是将主工厂类保留为生产,然后为单元测试添加一个新的工厂类?
    • 这完全取决于你。您可以创建一个新的工厂类进行测试,也可以确保在测试后清理了工厂类。
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多