需要在php中测试的建议

时间:2016-12-27 12:52:03

标签: php testing

我对测试很陌生。我有一个webapp,可以存储有关书籍的书籍和信息。

如果我调用我的路线sigprocmask(SIG_BLOCK, &newmask, &oldmask),它会触发我的HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); request.Method = WebRequestMethods.Http.Get; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream()); String responseString = reader.ReadToEnd(); response.Close(); 方法并在我的数据库中创建一本新书。这是简化的方法:

/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.
}

如何在不向goodreads发出http请求的情况下测试此内容?我需要验证语言是否在数据库中。我可以使用BookService.php的灯具。但是我如何能够存根/模拟(我不知道正确的术语)这个功能呢?

我使用的是Laravel和PHPUnit。

1 个答案:

答案 0 :(得分:0)

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

典型设置如下:

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