2017-03-07 56 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'文件。