Unit testing 使用Codeception和Laravel 5模块模拟单元测试类

Unit testing 使用Codeception和Laravel 5模块模拟单元测试类,unit-testing,laravel-5,mocking,codeception,Unit Testing,Laravel 5,Mocking,Codeception,在单元测试中,这不起作用: class SomeClassCest { public function tryToTest(UnitTester $I) { $mock = Mockery::mock(MyClass::class); $mock->shouldReceive('action')->once()->andReturn(true); $I->haveInstance(MyClass::class

在单元测试中,这不起作用:

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不会生效,永远不会调用
$mock->action
,而是调用真正的实现。如何使用Codeception和Laravel 5模块在单元测试中模拟类?

通常,在单元测试中,不会调用方法
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
    }
}