我正在尝试学习如何使用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设置或其他任何东西。任何帮助表示赞赏。
感谢。
答案 0 :(得分:88)
PHPUnit将识别为测试的唯一方法是名称为starting with test的方法。
因此,您应该将it_fetches_posts()
方法重命名为test_it_fetches_posts
或testItFetchesPosts
。驼峰案例命名是可选的,但如果稍后使用--testdox选项则很有用。
另外,如其他答案中所述,您还可以将@test
注释添加到任何方法中,它将被视为PHPUnit的测试。
答案 1 :(得分:64)
/** @test */
public function it_tests_something()
{
...
}
添加@test
告诉phpunit将该函数视为测试,无论名称如何。
答案 2 :(得分:2)
要么以单词'test'开头,例如test_something_should_work
,要么使用此注释/** @test */
更新测试文档
答案 3 :(得分:0)
此外,考虑一种情况,即您正在测试需要类A
的类B
(您将模拟)。调用$a->someMethod($mocked_B_class)
时,请确保您没有任何警告,例如尝试访问数组的属性,就像访问类($array = ['one','two']; $array->one)
的属性一样。
在这种情况下,它不会向您提供有关测试或错误的任何信息