終於讓我愚蠢的簡單測試通過後,我感覺我沒有正確地做到這一點。Laravel使用PHPUnit和Mockery進行測試 - 在Controller上設置依賴關係test
我有一個SessionsController,這是負責顯示登錄頁面和登錄的用戶。
我已經決定不使用外牆,這樣我就不必延長Laravel的TestCase和採取的性能損失在我的單元測試中。因此,我通過控制器注入所有的依賴,就像這樣 -
SessionsController - 構造
public function __construct(UserRepositoryInterface $user,
AuthManager $auth,
Redirector $redirect,
Environment $view)
{
$this->user = $user;
$this->auth = $auth;
$this->redirect = $redirect;
$this->view = $view;
}
我已經做了必要的變量聲明和使用的命名空間,這我不會在這裏包括它不必要的。
創建方法檢測用戶是否被授權,如果他們然後我將他們重定向到主頁,否則會顯示登錄表單。
SessionsController - 創建
public function create()
{
if ($this->auth->user()) return $this->redirect->to('/');
return $this->view->make('sessions.login');
}
現在的測試,我是全新的,以它。因此,與我裸...
SessionsControllerTest
class SessionsControllerTest extends PHPUnit_Framework_TestCase {
public function tearDown()
{
Mockery::close();
}
public function test_logged_in_user_cannot_see_login_page()
{
# Arrange (Create mocked versions of dependencies)
$user = Mockery::mock('Glenn\Repositories\User\UserRepositoryInterface');
$authorizedUser = Mockery::mock('Illuminate\Auth\AuthManager');
$authorizedUser->shouldReceive('user')->once()->andReturn(true);
$redirect = Mockery::mock('Illuminate\Routing\Redirector');
$redirect->shouldReceive('to')->once()->andReturn('redirected to home');
$view = Mockery::mock('Illuminate\View\Environment');
# Act (Attempt to go to login page)
$session = new SessionsController($user, $authorizedUser, $redirect, $view);
$result = $session->create();
# Assert (Return to home page)
}
}
這一切都通過,但我不希望有聲明所有爲我在寫SessionsControllerTest每個測試這些嘲笑依賴。有沒有辦法在構造函數中聲明這些模仿的依賴關係?然後通過變量調用它們來模擬?
謝謝你的任何建議,並花時間來閱讀我的問題。
謝謝@watcher!我很感謝你的全面回答 –
np,很高興提供幫助 –