2014-12-22 98 views
23

我想學習如何使用phpunit和laravel進行測試。當使用phpunit命令開始測試,我得到一個警告:Phpunit測試給出警告沒有在類中找到的測試

There was 1 failure: 

1) Warning 
No tests found in class "PostsTest". 

FAILURES!        
Tests: 2, Assertions: 1, Failures: 

我測試的類名和文件名匹配。我已閱讀其他有關不匹配名稱的問題。我的文件名是PostsTest.php和我的測試文件:

class PostsTest extends ApiTester { 


    public function it_fetches_posts() 

    { 
     $this->times(5)->makePost(); 

     $this->getJson('api/v1/posts'); 

     $this->assertResponseOk(); 

    } 

    private function makePost($postFields=[]) 
    { 
     $post = array_merge([ 
      'title' => $this->fake->sentence, 
      'content' => $this->fake->paragragraph 
     ], $postFields); 

     while($this->times --)Post::create($post); 
    } 
} 

如果必要的話我ApiTester:

use Faker\Factory as Faker; 

class ApiTester extends TestCase { 
    protected $fake; 
    protected $times = 1; 
    function __construct($faker) 
    { 
     $this->fake = Faker::create(); 
    } 
} 

我沒有任何線索錯誤所在。 Laravel或我的本地phpunit設置或其他任何東西。任何幫助表示讚賞。

謝謝。

+0

你看過手冊嗎? – hek2mgl

+0

我已閱讀laravel手冊。我正在使用laracasts教程。我是否缺少其他手冊? – ytsejam

+0

我明白你的意思了。在tut視頻中,我看到這個函數的名字被這樣使用,它正在工作。我沒有猜測函數名稱應該是「testItFetchesPosts」。我認爲這只是一個示例名稱。 – ytsejam

回答

67

是PHPUnit的將識別爲測試的唯一方法是那些名字starting with test

因此,您應該將it_fetches_posts()方法重命名爲test_it_fetches_poststestItFetchesPosts。駱駝大小寫命名是可選的,但如果您稍後使用--testdox選項,則可以使用它。

此外,在其他的答案說,你也可以在@test註釋添加到任何方法,它會被視爲由PHPUnit的測試。

+0

謝謝你的回答。我開始得到結果。我猜教程變得過時了。 – ytsejam

+16

這個答案是不正確的,因爲註釋'/ ** @test * /'指示phpunit將任何指定的方法視爲測試 –

35

Annotations are the answer

/** @test */ 
public function it_tests_something() 
{ 
    ... 
} 

添加@test告訴phpunit將函數視爲測試,而不考慮名稱。

0

此外,請考慮您正在測試需要類B(您會模擬)的類A的情況。當調用$a->someMethod($mocked_B_class)時,請確保您沒有任何警告,例如試圖訪問數組的屬性,就像訪問類($array = ['one','two']; $array->one)的屬性一樣。

在這種情況下,它不會給你任何有關測試或錯誤的信息