需要在php中测试的建议

问题描述:

我对测试非常陌生。我有一个web应用程序,用于存储关于书籍的书籍和信息。需要在php中测试的建议

如果我打电话给我的路线/store/它会触发我的store方法并在我的数据库中创建一本新书。这是简化的方法:

Book.php类文件:

public function __construct() { 
    $this->bookService = new BookService(); 
} 

public function store() { 
    $input = /* get post input values */ 
    $this->createDatabaseEntry($input); 
} 

private function createDatabaseEntry($input) { 
    // Creating database entry 
    $book = /* bla bla */ 

    $languages = $this->bookService->fetchLanguages($book->goodreads_id); 
    // And here i loop over the $languages and store them all in a extra table. 
} 

,在这里我有一个其他服务类BookService.php

public function fetchLanguages($goodreads_id) { 
    // Here i make an guzzle http call to a other service from goodreads.com 
} 

如何测试这个而不做HTTP请求goodreads ?我需要验证语言在数据库中。我可以使用灯具fetchLanguages()。但是,我怎样才能存根/模拟(我不知道正确的术语)这个函数?

我使用Laravel和PHPUnit。

你需要的就是这个 - 存根BookService类。因为你直接实例化它,所以存根并不是那么容易。您应该将其注入到Book类中,以便您可以在测试中注入存根(可以通过构造函数注入或通过提供setter来覆盖$ this-> bookService)。

一个典型的设置是这样的:

$serviceMock = $this->getMock('BookService'); 
$serviceMock->method('fetchLanguages')->willReturn(<some hard-coded-result-here>); 
$book = new Book($serviceMock);