2017-03-07 2 views
0

Ich versuche, einen Dienst in einem Funktionstest zu verspotten, die von einem anderen Dienst verwendet wird:wie ein Dienst zu verspotten, um es zu injizieren richtig

$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 

wenn ich versuche, innerhalb eines die Befehl zu setzen das Original sendMailToUser, was ich bekomme, ist der Code zu stoppen, obwohl ich versucht, es zu verspotten, indem Sie 9. Was ist los damit? Die Service-I-Tests sind hat die folgende Erklärung, dann nahm ich an dem injizierte Dienst wurde schreibt die oben:

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"]] 

Antwort

0

Ich vertraue Symfony Dienste korrekt zu erstellen, und so werde ich in der Regel nicht um Leistungen zu erhalten, um dann Test in ihnen (ich habe einen Rauchtest, der versucht, fast jeden Service zu erstellen).

Also, wenn Sie versuchen, eine 'belka.auth_bundle.user_handler' zu bekommen, würde ich manuell die Belka\AuthBundle\Handler\UserHandler Instanz erstellen, mit Ihrem Schein als eines der Argumente.

Für Dienste, die tiefer in den Diensten benötigt werden, gibt es keine einfachen Möglichkeiten, sie zu verspotten (oder den Mock an Ort und Stelle zu bringen), aber Sie können die Dienstcontainerumgebungen verwenden, um sie zu überschreiben.

Zum Beispiel habe ich einen Dienst, der testet, ob ein Request von einem Bot kommt - aber während ich Funktionstests durchführe, ersetze ich ihn komplett durch einen Dienst, der immer 'Kein Bot' sagt, durch Überschreiben von 'app.bot_detect' .detector‘Service in /config/services_test.yml

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

im Haupt config/services.yml würde die Klasse wirklich die Prüfung durchführen, aber die Methode in der BotDetectorNeverBot Klasse Testumgebung sagt immer falsch.

Auf die gleiche Weise könnten Sie belka.auth_bundle.mail_service in services_test.yml (oder config_test.yml) überschreiben, um keine E-Mails zu senden und stattdessen etwas zu speichern. Sie müssen nur sicherstellen, dass Sie '* _test.yml' Dateien entsprechend einbeziehen.

Verwandte Themen