测试一个类方法调用另一个

时间:2015-06-24 18:06:33

标签: unit-testing phpunit mockery

想象一下,我有以下课程。

class SomeClass {

    public function shortcutMethod($arg1) {
        return $this->method($arg1, 'something');
    }

    public function method($arg1, $arg2) {
        // some stuff
    }

}

因此shortcutMethod是另一种方法的快捷方式。我们假设我想编写一个给定的测试,$arg1 shortcutMethod将使用正确的参数正确调用method

到目前为止,我认为我认为我需要模拟该类以期望使用某些参数调用method,然后在模拟对象上调用shortcutMethod,如此(注意我正在使用嘲笑)

$mock = m::mock("SomeClass");
$mock = $mock->shouldReceive('method')->times(1)->withArgs([
    'foo',
    'something'
]);

$mock->shortcutMethod('foo');

这导致像shortcutMethod() does not exist on this mock object这样的例外。

我是否误解了嘲笑的用法?我理解对于注入类中的依赖项的对象更有意义,但在这种情况下是什么?你会怎么做?更重要的是,这种测试是无用的,如果是这样,为什么?

1 个答案:

答案 0 :(得分:1)

你应该使用mocking来模拟被测试类的依赖项,而不是被测试的类本身。毕竟,你正试图测试你班级的真实行为。

你的例子有点基础。如何测试这样的类将取决于你的method函数的作用。如果它返回shortCutMethod返回的值,那么我会说你应该断言shortCutMethod的输出。应该模拟method函数中的任何依赖项(属于其他类的方法)。我对嘲弄并不熟悉,但我已经给你的例子调整了一个版本。

class SomeClass {

   private $dependency;

   public function __construct($mockedObject) {
      $this->dependency = $mockedObject;
   }

   public function shortcutMethod($arg1) {
      return $this->method($arg1, 'something');
   }

   public function method($arg1, $arg2) {
      return $this->dependency->mockedMethod($arg1, $arg2);
   }

}

$mock = m::mock("mockedClass");

$mock->shouldReceive('mockedMethod')->times(1)->withArgs([
   'foo',
   'something'
])->andReturn('returnedValue');

$testCase = new SomeClass($mock);

$this->assertEquals(
   'returnedValue',
   $testCase->shortcutMethod('foo')
);

话虽如此,可以部分模拟测试中的类,以便您可以测试shortCutMethod函数的实际行为,但是模拟出method函数来声明它被调用预期的论点。看看部分嘲笑。

http://docs.mockery.io/en/latest/reference/partial_mocks.html