2017-02-18 9 views
0

私は単体テストで初心者です。私はdocumentationを読んで同じことをしようとする。TestCaseTraitでPHPUnitを使用する方法

まず第一に、私は次の環境を持っている:

$ php -v 
PHP 7.0.15-1+deb.sury.org~trusty+1 (cli) (built: Jan 20 2017 09:16:11) (NTS) 
Copyright (c) 1997-2017 The PHP Group 
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.15-1+deb.sury.org~trusty+1, Copyright (c) 1999-2017, by Zend Technologies 

$ cat composer.json 
... 
"require-dev": { 
    "phpunit/phpunit": "^6.0", 
    "phpunit/dbunit": "^3.0" 
}, 
... 

私は/ srcに、/テスト及び/ベンダーのディレクトリを持っています。 Composerオートローダーは完璧に動作します。

私のPHPプロジェクトは、MySQLデータベースと密接に結びついています。私が望むのは、これらの機能を単体テストするだけです。

$ cat tests/phpunit.xml 
<phpunit> 
    <php> 
     <ini name="display_errors" value="On" /> 
     <ini name="display_startup_errors" value="On" /> 
    </php> 
</phpunit> 

とテスト:罰金

$ cat tests/SimpleTest.php 
<?php 
use PHPUnit\Framework\TestCase; 
use PHPUnit\DbUnit\TestCaseTrait; 

require_once(__DIR__.'/../vendor/autoload.php'); 

class SimpleTest extends TestCase 
{ 
    // use TestCaseTrait; 

    protected function getConnection() {} 
    protected function getDataSet() {} 

    public function testFirstExample() 
    { 
     $this->assertEquals(1, 1); 
    } 

    public function testSecondExample() 
    { 
     $this->assertEquals(1, 0); 
    } 

} 
?> 

$ phpunit --testdox --verbose --configuration=tests/phpunit.xml tests/SimpleTest.php 
PHPUnit 6.0.6 by Sebastian Bergmann and contributors. 

Runtime:  PHP 7.0.15-1+deb.sury.org~trusty+1 
Configuration: /home/ubuntu/workspace/tests/phpunit.xml 

Simple 
[x] First example 
[ ] Second example 

すべてと私はラインuse TestCaseTrait;のコメントを解除するまで、期待通りに動作します。この瞬間から、テストは機能しません。 テスト機能の中で実行されていません(次のコードを追加してチェックしました:fwrite(STDERR, 'Here we are!'))。

質問:use TestCaseTrait;で何が問題になっていますか?なぜテスト全体が壊れたのですか?どうすれば解決できますか?

ありがとうございました! P.P.私の英語には申し訳ありません。


結論: それは奇妙ですが、問題はsetUp()機能していました。あなたはテストでそれを追加する必要があります!私がしたとき、私のテストは正常に動作しました...

+0

これがあなたの問題であるかどうかわかりませんが、[phpunit doc](https://phpunit.de/manual/current/en/database.html)を見ると、 'getConnection'と' getDataSet'は何かを返すべきです。彼らはあなたの例では無効です。 – k0pernikus

+0

もちろん私はそれを試しました。これらの関数はそれぞれ '$ this-> createDefaultDBConnection($ pdo、 'test');' と 'new MyApp_DbUnit_ArrayDataSet(配列(...))' を返します。しかし、それは何も変わらない... – GHopper

答えて

0

結論:問題はsetUp()関数にありました。 あなたはテストでそれを追加する必要があります!私はそれをやったときに、私のテストは仕事 が正しく

これは不思議ではないとなった、丸太このラインについて

1) SimpleTest::testFirstExample 
TypeError: Argument 1 passed to PHPUnit\DbUnit\DefaultTester::__construct() must be an instance of PHPUnit\DbUnit\Database\Connection, null given, called in /x/vendor/phpunit/dbunit/src/TestCaseTrait.php on line 102 

2) SimpleTest::testSecondExample 
TypeError: Argument 1 passed to PHPUnit\DbUnit\DefaultTester::__construct() must be an instance of PHPUnit\DbUnit\Database\Connection, null given, called in /x/vendor/phpunit/dbunit/src/TestCaseTrait.php on line 102 

そして、何を見てみましょうか? $this->getConnection()

# TestCaseTrait::102 
return new DefaultTester($this->getConnection()); 

結果は、あなたがとしてgetConnection方法を実装しましたので、nullです。

setUpを宣言することによって、TestCaseTrait::setUpがオーバーライドされ、$this->getConnection()が呼び出されたので、今すぐ動作しています。

+0

そうです。私に教えてください、どうやってこれらのログを取得しましたか?彼らは問題解決に非常に役立ちます。 – GHopper

+0

@GHopper私はコマンドラインでテストを実行しましたが、これらのエラーは出力されました。あなたはどのようにurテストを実行しますか? –

+0

'$ phpunit --testdox --verbose --configuration = tests/phpunit.xml tests/SimpleTest.php' – GHopper

関連する問題