web-dev-qa-db-ja.com

Phpunitテストはクラスでテストが見つからないことを警告します

私はphpunitとlaravelでテストする方法を学ぼうとしています。 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設定またはその他。どんな助けでも大歓迎です。

ありがとう。

42
ytsejam

注釈が答えです

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

@testを追加すると、名前に関係なく、関数をテストとして扱うようphpunitに指示されます。

74
CJ Thompson

PHPUnitがテストとして認識する唯一のメソッドは、名前が test のメソッドです。

したがって、it_fetches_posts()メソッドの名前をtest_it_fetches_postsまたはtestItFetchesPostsに変更する必要があります。キャメルケースの命名はオプションですが、後で--testdoxオプションを使用する場合に便利です。

また、他の回答で述べたように、@testアノテーションを任意のメソッドに追加することもできます。これは、PHPUnitによるテストと見なされます。

89
gontrollez

名前をtest_something_should_workのようなWord 'test'で始めるか、この注釈/** @test */でテストドキュメントを更新します。

3
Yamen Ashraf

さらに、クラスAを必要とするクラスB(モックする)をテストする場合を考えます。 $a->someMethod($mocked_B_class)が呼び出されるとき、クラスのプロパティにアクセスするように配列のプロパティにアクセスしようとするなど、警告がないことを確認してください($array = ['one','two']; $array->one)

この場合、テストまたはエラーに関する情報は提供されません

0
shabany