Подтвердить что ты не робот

Тесты Phpunit дают предупреждение о том, что в классе нет тестов

Я пытаюсь научиться тестировать phpunit и laravel. Когда вы запускаете тест с помощью команды phpunit, я получаю предупреждение:

There was 1 failure:

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

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

Мое имя класса и имя файла совпадают. Я прочитал другие проблемы, касающиеся unmatching names. мое имя файла 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 или что-то еще. Любые советы приветствуются.

Спасибо.

4b9b3361

Ответ 1

Единственными методами, которые PHPUnit распознает в качестве тестов, являются те, у которых имена начинаются с теста.

Итак, вы должны переименовать метод it_fetches_posts() в test_it_fetches_posts или testItFetchesPosts. Именование наименований верблюдов является необязательным, но полезно, если вы позже используете опцию --testdox.

Кроме того, как указано в другом ответе, вы можете также добавить аннотацию @test к любому методу, и это будет считаться тестом PHPUnit.

Ответ 2

Аннотации - это ответ.

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

Добавление этого @test сообщает phpunit рассматривать функцию как тест, независимо от имени.

Ответ 3

Кроме того, рассмотрите случай, когда вы тестируете класс A, для которого требуется класс B (который вы будете издеваться). Когда вызывается $a->someMethod($mocked_B_class), убедитесь, что у вас нет никаких предупреждений, например, чтобы попытаться получить доступ к свойству массива, как если бы вы получили доступ к свойству класса ($array = ['one','two']; $array->one).

В этом случае он не даст вам никакой информации об этом тесте или ошибке