2017-03-07 59 views
0

我想要的功能測試,這是被其他服務中嘲笑服務:如何嘲笑服務,以注入其正確

$client = static::createClient(); 

    $stub = $this->createMock(MailService::class); 
    $stub->method('sendMailToUser')->willReturn(9); 
    $client->getContainer()->set('belka.auth_bundle.mail_service', $stub); 
    // the *real* test should start here 

,如果我試圖把一個die命令內原來的sendMailToUser,我得到的是代碼停止運行,儘管我試圖通過返回9來嘲笑它。它有什麼問題?我測試該服務具有以下聲明,然後我猜注入的服務是在一個上面寫道:

belka.auth_bundle.user_handler: 
    class: Belka\AuthBundle\Handler\UserHandler 
    arguments: 
     - '@belka.auth_bundle.user_repository' 
     - '@belka.auth_bundle.mail_service' 
    calls: 
     - [setRequest, ["@request_stack"]] 
     - [setSettings, ["@belka.auth_bundle.setting_handler"]] 
     - [setBodyJsonHandler, ["@belka.container_support_bundle.body_json_handler"]] 
     - [setQuantityHandler, ["@belka.container_support_bundle.quantityhandler"]] 

回答

0

我相信Symfony的正確創建服務,所以我通常不會去再測試服務在他們內部(我確實有一個煙霧測試,儘管嘗試創建幾乎所有的服務)。

所以,如果你想獲得一個'belka.auth_bundle.user_handler',我會手動創建Belka\AuthBundle\Handler\UserHandler實例,以你的模擬作爲參數之一。

對於需要在服務內部更深的服務,不容易嘲笑它們(或者讓模擬到位),但是您可以使用服務容器環境來覆蓋它們。

例如,我有一個服務,用於測試請求是否來自機器人 - 但是在運行功能測試時,我將其全部替換爲始終表示「不是機器人」的服務,通過覆蓋我的'app.bot_detect .detector」服務/config/services_test.yml

# set the default bot detector to a simple fake, always return false 
app.bot_detect.detector: 
    class: App\Services\BotDetectorNeverBot 

在主配置/ services.yml,類真的會進行檢查,但在測試環境中的BotDetectorNeverBot類中的方法總是說假的。

以同樣的方式,您可以覆蓋services_test.yml(或config_test.yml)中的belka.auth_bundle.mail_service以不發送電子郵件,而是存儲某些內容。你只需要確保你包含'* _test.yml'文件。