Я пишу модульный тест для существующего кода, который похож на этот
class someClass {
public function __construct() { ... }
public function someFoo($var) {
...
$var = "something";
...
$model = new someClass();
model->someOtherFoo($var);
}
public someOtherFoo($var){
// some code which has to be mocked
}
}
Вот как я могу имитировать вызов функции « someOtherFoo
», чтобы он не выполнялся » некоторый код
«внутри someOtherFoo
?
class someClassTest {
public function someFoo() {
$fixture = $this->getMock('someClass ', array('someOtherFoo'));
$var = "something";
....
// How to mock the call to someOtherFoo() here
}
}
Можно ли смоделировать конструктор, чтобы он возвращал мою собственную сконструированную функцию или переменную?
Спасибо
Вы можете добавить префикс к имени своего псевдонима в overload:
. Ознакомьтесь с документами по Злостным зависимостям .
Ваш пример будет выглядеть примерно так:
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
*/
class SomeClassTest extends \PHPUnit\Framework\TestCase
{
public function test_some_foo()
{
$someOtherClassMock = \Mockery::mock('overload:SomeOtherClass');
$someOtherClassMock->shouldReceive('someOtherFoo')
->once()
->with('something')
->andReturn();
$systemUnderTest = new SomeClass();
$systemUnderTest->someFoo('something');
}
}
Я добавил аннотацию @runTestsInSeparateProcesses
, потому что обычно проверяемый класс будет использоваться и в других тестах. Без аннотации происходит сбой автозагрузчика из-за ошибки class already exists
.
Если это единственное место, где макетируемый класс используется в вашем тестовом наборе, то вы должны удалить аннотацию.