Модульный тест для имитации метода, вызываемого новым объектом класса

Я пишу модульный тест для существующего кода, который похож на этот

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
   }

}

Можно ли смоделировать конструктор, чтобы он возвращал мою собственную сконструированную функцию или переменную?

Спасибо

30
задан Sumitk 20 October 2011 в 00:51
поделиться

1 ответ

Вы можете добавить префикс к имени своего псевдонима в 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.

Если это единственное место, где макетируемый класс используется в вашем тестовом наборе, то вы должны удалить аннотацию.

6
ответ дан 28 November 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: