想象一下,我有以下课程。
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
这样的例外。
我是否误解了嘲笑的用法?我理解对于注入类中的依赖项的对象更有意义,但在这种情况下是什么?你会怎么做?更重要的是,这种测试是无用的,如果是这样,为什么?
答案 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