Ложные занятия на модульных тестах с модулем Codeception и Laravel 5 - PullRequest
0 голосов
/ 27 июня 2018

В модульных тестах это не работает:

class SomeClassCest
{
    public function tryToTest(UnitTester $I)
    {
        $mock = Mockery::mock(MyClass::class);
        $mock->shouldReceive('action')->once()->andReturn(true);
        $I->haveInstance(MyClass::class, $mock);

        $classToTest = app(SomeClass::class);
        // this method calls the MyClass action method
        $classToTest->run();

        // some asserts here
    }
}

Макет не действует, $mock->action никогда не вызывается, вместо этого вызывается реальная реализация. Как макетировать классы на модульных тестах с Codeception и модулем Laravel 5?

1 Ответ

0 голосов
/ 27 июня 2018

Обычно в модульных тестах методы amOnRoute, amOnPage не вызываются, поэтому Laravel5->doRequest() не будет применять привязки, поэтому, чтобы смоделировать класс, в помощнике модулей из набора Codeception:

class Unit extends \Codeception\Module
{

    /**
     * @param $realClass
     * @param $mock
     */
    public function mockClass($realClass, $mock)
    {
        $this->getModule('Laravel5')->getApplication()->instance($realClass, $mock);
    }

}

В модульном тесте:

class SomeClassCest
{
    public function tryToTest(UnitTester $I)
    {
        $mock = Mockery::mock(MyClass::class);
        $mock->shouldReceive('action')->once()->andReturn(true);
        $I->mockClass(MyClass::class, $mock);

        $classToTest = app(SomeClass::class);
        // this method calls the MyClass action method
        $classToTest->run();

        // the mocked classs is used insetad of the real one

        // do some asserts here
    }
}
...