Я пытаюсь выполнить модульный тест класса, где один общедоступный метод (метод 1) использует другой открытый метод (метод 2) того же класса внутри него. Например.Мощный публичный метод тестируемого класса
class MyClass {
public function method1()
{
$var = $this->method2();
// Do stuff with var to get $answer
return $answer;
}
public function method2()
{
// Do complex workings out to get $var
return $var;
}
}
Теперь method2
уже протестированы, и я не хочу, чтобы создать аргумент для того, чтобы на самом деле назвать это в то время тестирования method1
. Я просто хочу макет method2
и определить в своем тесте, что будет возвращено. Это то, что у меня есть:
function test_method1()
{
$myClass = new MyClass();
$mockedMyClass = Mockery::mock('MyClass');
$mockedMyClass->shouldReceive('method2')->once()->andReturn([1,2,3,4]); // mocked $var returned to be used in the rest of method1
$answer = $myClass->method1();
// Assertions
}
Очевидно, что это не работает, как метод испытывается в том же классе, содержит метод дразнят, так что нет никакого способа, чтобы пройти в издевался классе как зависимость. Каков наилучший способ издеваться над методом method2?
Всякий раз, когда вы чувствуете потребность высмеивать метод класса, который вы тестируете , это показатель того, что класс должен быть разделен на две части и проверен индивидуально. Потому что, если вы чувствуете потребность насмехаться, потому что «я не хочу создавать аргумент», класс, вероятно, слишком много. – Sven