Тесты 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 или что-то еще. Любые советы приветствуются.
Спасибо.
Ответы
Ответ 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)
.
В этом случае он не даст вам никакой информации об этом тесте или ошибке