【问题标题】:Unable to test static method using Mock class in PHPUnit无法在 PHPUnit 中使用 Mock 类测试静态方法
【发布时间】:2014-02-08 19:03:44
【问题描述】:

我正在尝试在一个类上测试一个静态方法,但它依赖于一个不会在测试之间重置的静态数组属性,所以我虽然可以创建一个模拟类并针对它进行测试。

唯一的问题是mock类的静态方法没有像原来的静态方法那样返回值。

这是我的课...

class Thing {
    static public function doThing() {
        return 'yeah!';
    }
}

...这里是测试类...

class ThingTest {
    public function testDoSomething() {
        $mock_class = $this->getMockClass('Thing');
        $this->assertEqual('yeah!', $mock_class::doThing())
    }
}

此测试失败,并显示消息“断言 null 与预期的'是的!'匹配失败。”

我在这里缺少什么?我认为没有在 getMock() 调用中指定方法意味着保留了原始方法,但显然不是。 :o(

任何指针都会很棒。谢谢。

编辑

我是从记忆中输入的,而不是从复制代码中输入的,因为我已经进行了进一步的更改以尝试解决此问题。在为模拟对象编写了更多测试之后,我意识到如果您将 array() 作为第二个参数 ($methods) 传递给 getMock[Class],那么它会删除所有方法,并且我相信这就是我实际所做的。我正在这样做,因为我还想在第三个参数中传递构造函数参数。代码可能看起来更像这样......

class ThingTest {
    public function testDoSomething() {
        $mock_class = $this->getMockClass(
            'Thing',
            array(),
            array( 'something' )
        );
        $this->assertEqual('yeah!', $mock_class::doThing())
    }
}

【问题讨论】:

标签: php unit-testing phpunit


【解决方案1】:

您不应该模拟包含您要测试的方法的类。如果你模拟这个类,你也不能在没有通过

定义它之前调用任何方法
-> expects('methodName') 
-> with($this->equalTo($parameter),[$this->equalTo($parameter2),...]) 
-> will($this->returnValue($value))

。模拟用于降低测试的复杂性。假设您要测试如下所示的函数:

class test{
    private $someClass;

    public function __construct(SomeInterface $someClass){
        $this -> someClass = $someClass;
    }
    public function test(){
        $someVariable = $this -> someClass -> doSomething();
        changeSomething($someVariable);
        return $someVariable;
    }
}

如果您不模拟 someClass,则必须测试 someClass -> doSomething 的整个代码。但这不是你想要做的。您只想使用函数 doSomething 的返回。这就是您需要模拟的地方。它降低了测试的复杂性并提供 REAL UNIT 测试,而不是测试整个应用程序。

所以你需要做的是:

class ThingTest {
    public function testDoSomething() {
        $class = new Thing();
        $this->assertEquals('yeah!', $class::doThing());
    }
}

不需要模拟。

【讨论】:

    【解决方案2】:

    您忘记通过PHPUnit_Framework_TestCase 扩展。

    class ThingTest extends PHPUnit_Framework_TestCase {
      public function testDoSomething() {
         $mock_class = $this->getMockClass('Thing');
         $this->assertEqual('yeah!', $mock_class::doThing())
      }
    }
    

    【讨论】:

      【解决方案3】:

      也许$mock_class 是一个对象,而不是一个字符串类名?尝试使用下一个:

      class ThingTest {
          public function testDoSomething() {
              $mock_class = $this->getMockClass('Thing');
              $this->assertEqual('yeah!', Thing::doThing())
          }
      }
      

      这是工作吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 2018-02-26
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 2019-10-29
        • 2017-10-20
        • 1970-01-01
        相关资源
        最近更新 更多