Here and below, the term tests will be unit tests.
/** * @return bool */ public function login() { if ($this->validate()) { $user = User::findByUsername($this->username); return Yii::$app->user->login($user); } else { return false; } }
public function setUp() { parent::setUp(); Yii::configure(Yii::$app, [ 'components' => [ 'user' => [ 'class' => 'yii\web\User', 'identityClass' => 'common\models\User', ], ], ]); } protected function tearDown() { Yii::$app->user->logout(); parent::tearDown(); } public function testLoginCorrect() { $model = new LoginForm([ 'username' => 'User', 'password' => 'CorrectPassword', ]); expect('Model should login user', $model->login())->true(); } public function fixtures() { return [ 'user' => [ 'class' => UserFixture::className(), 'dataFile' => '@tests/codeception/common/unit/fixtures/data/models/user.php' ], ]; }
$ codecept run Codeception PHP Testing Framework v2.1.2 Powered by PHPUnit 4.8.10-5-g4ecd63c by Sebastian Bergmann and contributors. Tests\codeception\common.unit Tests (1) ------------------------------- Test login correct (unit\models\LoginFormTest::testLoginCorrect) Ok ----------------------------------------------------------------------- Time: 1.41 seconds, Memory: 9.75Mb OK (1 test, 1 assertion)
/** * @param \yii\web\User $webUserComponent * @param array $config */ public function __construct(\yii\web\User $webUserComponent, $config = []) { $this->setWebUserComponent($webUserComponent); parent::__construct($config); } /** * @param \yii\web\User $model */ private function setWebUserComponent($model) { $this->webUserComponent = $model; } /** * @return \yii\web\User */ protected function getWebUserComponent() { return $this->webUserComponent; } /** * @return bool */ public function login() { if ($this->validate()) { return $this->getWebUserComponent()->login($this->getUser()); } else { return false; } } /** * @return \common\models\User * @throws \yii\base\Exception */ protected function getUser() { $user = User::findByUsername($this->username); if (!$user) { throw new Exception(' '); } return $user; }
public function testLoginCorrect() { $webUserComponentMock = \Mockery::mock(\yii\web\User::className()) ->shouldReceive('login')->once()->andReturn(true)->getMock(); $userModelMock = \Mockery::mock(\common\models\User::className()); $loginFormPartialMock = \Mockery::mock(LoginForm::className()) ->shouldAllowMockingProtectedMethods() ->makePartial() ->shouldReceive('getWebUserComponent')->once()->andReturn($webUserComponentMock)->getMock() ->shouldReceive('validate')->once()->andReturn('true')->getMock() ->shouldReceive('getUser')->once()->andReturn($userModelMock)->getMock(); /** @var LoginForm $loginFormPartialMock */ expect('Model should login user', $loginFormPartialMock->login())->true(); }
$ codecept run Codeception PHP Testing Framework v2.1.2 Powered by PHPUnit 4.8.10-5-g4ecd63c by Sebastian Bergmann and contributors. Tests\codeception\common.unit Tests (1) ------------------------------- Test login correct (unit\models\LoginFormTest::testLoginCorrect) Ok ----------------------------------------------------------------------- Time: 895 ms, Memory: 8.25Mb OK (1 test, 1 assertion)
$ codecept run Codeception PHP Testing Framework v2.1.2 Powered by PHPUnit 4.8.10-5-g4ecd63c by Sebastian Bergmann and contributors. Tests\codeception\common.unit Tests (10) ------------------------------------------------------------------------- Test login correct (unit\models\LoginFormTest::testLoginCorrect) Ok Test login correct2 (unit\models\LoginFormTest::testLoginCorrect2) Ok Test login correct3 (unit\models\LoginFormTest::testLoginCorrect3) Ok Test login correct4 (unit\models\LoginFormTest::testLoginCorrect4) Ok Test login correct5 (unit\models\LoginFormTest::testLoginCorrect5) Ok Test login correct6 (unit\models\LoginFormTest::testLoginCorrect6) Ok Test login correct7 (unit\models\LoginFormTest::testLoginCorrect7) Ok Test login correct8 (unit\models\LoginFormTest::testLoginCorrect8) Ok Test login correct9 (unit\models\LoginFormTest::testLoginCorrect9) Ok Test login correct10 (unit\models\LoginFormTest::testLoginCorrect10) Ok ------------------------------------------------------------------------- Time: 6.09 seconds, Memory: 15.00Mb OK (10 tests, 10 assertions)
$ codecept run Codeception PHP Testing Framework v2.1.2 Powered by PHPUnit 4.8.10-5-g4ecd63c by Sebastian Bergmann and contributors. Tests\codeception\common.unit Tests (10) ------------------------------------------------------------------------- Test login correct (unit\models\LoginFormTest::testLoginCorrect) Ok Test login correct2 (unit\models\LoginFormTest::testLoginCorrect2) Ok Test login correct3 (unit\models\LoginFormTest::testLoginCorrect3) Ok Test login correct4 (unit\models\LoginFormTest::testLoginCorrect4) Ok Test login correct5 (unit\models\LoginFormTest::testLoginCorrect5) Ok Test login correct6 (unit\models\LoginFormTest::testLoginCorrect6) Ok Test login correct7 (unit\models\LoginFormTest::testLoginCorrect7) Ok Test login correct8 (unit\models\LoginFormTest::testLoginCorrect8) Ok Test login correct9 (unit\models\LoginFormTest::testLoginCorrect9) Ok Test login correct10 (unit\models\LoginFormTest::testLoginCorrect10) Ok ------------------------------------------------------------------------- Time: 1.05 seconds, Memory: 8.50Mb OK (10 tests, 10 assertions)
protected function getUser()
public function testSuccessValidation() { $loginForm = new LoginForm([ 'username' => 'User', 'password' => 'CorrectPassword' ]); expect('Validation should be success', $loginForm->validate())->true(); }
public function testFailedValidation() { $loginForm = new LoginForm([ 'username' => 'User', 'password' => 'INCORRECT-Password' ]); expect('Validation should be failed', $loginForm->validate())->false(); }
public function testGetUserByUsername() { $userMock = \Mockery::mock(User::className()) ->shouldReceive('findByUsername')->once()->andReturn(\Mockery::self())->getMock(); $userName = 'User'; $loginForm = new LoginForm($userMock, [ 'username' => $userName ]); expect('getUser method should return User', $loginForm->getUser() instanceof User)->true(); $userMock->shouldHaveReceived('findByUsername', [$userName]); }
/** * @param \common\models\User $user * @param array $config */ public function __construct(User $user, $config = []) { $this->user = $user; parent::__construct($config); } /** * @return \common\models\User * @throws \yii\base\Exception */ public function getUser() { $user = $this->user->findByUsername($this->username); if (!$user) { throw new Exception(' '); } return $user; }
public function testSuccessValidation() { $userMock = \Mockery::mock(User::className()) ->shouldReceive('validatePassword')->once()->andReturn(true)->getMock() ->shouldReceive('findByUsername')->once()->andReturn(\Mockery::self())->getMock(); $loginForm = new LoginForm($userMock, [ 'username' => 'User', 'password' => 'CorrectPassword' ]); expect('Validation should be success', $loginForm->validate())->true(); } public function testFailedValidation() { $userMock = \Mockery::mock(User::className()) ->shouldReceive('validatePassword')->once()->andReturn(false)->getMock() ->shouldReceive('findByUsername')->once()->andReturn(\Mockery::self())->getMock(); $loginForm = new LoginForm($userMock, [ 'username' => 'User', 'password' => 'INCORRECT-Password' ]); expect('Validation should be failed', $loginForm->validate())->false(); } public function testGetUserByUsername() { $userMock = \Mockery::mock(User::className()) ->shouldReceive('findByUsername')->once()->andReturn(\Mockery::self())->getMock(); $userName = 'User'; $loginForm = new LoginForm($userMock, [ 'username' => $userName ]); expect('getUser method should return User', $loginForm->getUser() instanceof User)->true(); $userMock->shouldHaveReceived('findByUsername', [$userName]); } public function testValidatePassword() { $userMock = \Mockery::mock(User::className()) ->shouldReceive('validatePassword')->once()->andReturn(true)->getMock() ->shouldReceive('findByUsername')->once()->andReturn(\Mockery::self())->getMock(); $password = 'RightPassword'; $loginForm = new LoginForm($userMock, [ 'password' => $password ]); $loginForm->validatePassword('password'); expect('validate password should be success', $loginForm->getErrors())->isEmpty(); $userMock->shouldHaveReceived('validatePassword', [$password]); }
/** * @param \common\models\User $user * @param array $config */ public function __construct(User $user, $config = []) { $this->user = $user; parent::__construct($config); } public function rules() { return [ [['username', 'password'], 'required'], ['password', 'validatePassword'] ]; } /** * @param string $attribute */ public function validatePassword($attribute) { $user = $this->getUser(); if (!$user->validatePassword($this->$attribute)) { $this->addError($attribute, 'Incorrect password.'); } } /** * @return \common\models\User * @throws \yii\base\Exception */ public function getUser() { $user = $this->user->findByUsername($this->username); if (!$user) { throw new Exception(' '); } return $user; }
public function testLogin() { $userComponentMock = \Mockery::mock(\yii\web\User::className()) ->shouldReceive('login')->once()->andReturn(true)->getMock(); Yii::$app->set('user', $userComponentMock); $userMock = \Mockery::mock(User::className()) ->shouldReceive('findByUsername')->once()->andReturn(\Mockery::self())->getMock(); $loginForm = new LoginForm($userMock); expect('login should be success', $loginForm->login())->true(); $userComponentMock->shouldHaveReceived('login', [$userMock]); }
/** * @return bool */ public function login() { return Yii::$app->user->login($this->getUser()); }
$ codecept run Codeception PHP Testing Framework v2.1.2 Powered by PHPUnit 4.8.10-5-g4ecd63c by Sebastian Bergmann and contributors. Tests\codeception\common.unit Tests (5) --------------------------------------------------------------------------------- Test login (LoginFormTest::testLogin) Ok Test success validation (LoginFormTestWithoutDbTest::testSuccessValidation) Ok Test failed validation (LoginFormTestWithoutDbTest::testFailedValidation) Ok Test get user by username (LoginFormTestWithoutDbTest::testGetUserByUsername) Ok Test validate password (LoginFormTestWithoutDbTest::testValidatePassword) Ok --------------------------------------------------------------------------------- Time: 973 ms, Memory: 10.50Mb OK (5 tests, 5 assertions)
Time: 1.62 seconds, Memory: 15.75Mb OK (50 tests, 50 assertions)
Source: https://habr.com/ru/post/268381/
All Articles