Phpunit tests gives warning no tests found in class

PhpLaravelPhpunit

Php Problem Overview


I am trying to learn how to test with phpunit and laravel. When start the test using phpunit command, I am getting a warning :

There was 1 failure:

1) Warning
No tests found in class "PostsTest".
                                     
FAILURES!                            
Tests: 2, Assertions: 1, Failures: 

My test classname and filename matches. I have read other problems about unmatching names. my filename is PostsTest.php and my test file :

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);
	}
}

if necessary my ApiTester :

use Faker\Factory as Faker;

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

I dont have any clue where the error is. Laravel or my local phpunit settings or anything else. Any helps is appreciated.

Thanks.

Php Solutions


Solution 1 - Php

Annotations are the answer.

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

Adding that @test tells phpunit to treat the function as a test, regardless of the name.

Solution 2 - Php

The only methods that PHPUnit will recognize as tests are those with names starting with test.

So you should rename the it_fetches_posts() method to test_it_fetches_posts or testItFetchesPosts. The camel case naming is optional but useful if you use the --testdox option later.

Also, as stated in other answer you can also add the @test annotation to any method and it will be considered a test by PHPUnit.

Solution 3 - Php

Either begin its name with word 'test' like test_something_should_work or update the test docs with this annotation /** @test */

Solution 4 - Php

Additionally, consider a case where you are testing a class A that requires a class B (that you will mock). When $a->someMethod($mocked_B_class) is called, make sure you don't have any warnings in it such as trying to access a property of an array like you would access the property of a class ($array = ['one','two']; $array->one).

In this case it wont give you any information about the test or the error

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionytsejamView Question on Stackoverflow
Solution 1 - PhpCJ ThompsonView Answer on Stackoverflow
Solution 2 - PhpgontrollezView Answer on Stackoverflow
Solution 3 - PhpYamen AshrafView Answer on Stackoverflow
Solution 4 - PhpshabanyView Answer on Stackoverflow