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
}
}