web-dev-qa-db-ja.com

単体テストのためにデータベース接続をデバッグする方法を教えてください。

私は自分のMac上でMAMPを使ってワードプレス環境をセットアップし、3.5.1をローカルで実行しています(つまりhttp://localhost:8888/blogは動作します)。私はwordpress.orgから単体テストスーツを実行しようとしていますが、データベースへの接続に問題があります。

$svn co https://unit-tests.svn.wordpress.org/trunk wordpress-tests
$cd wordpress-tests
$cp wp-tests-config-sample.php wp-tests-config.php

私の設定用にwp-test-config.phpを編集します

$ cat wp-tests-config.php
<?php

/* Path to the WordPress codebase you'd like to test. Add a backslash in the end. */
define( 'ABSPATH', '/Applications/MAMP/htdocs/blog/' );

// Test with multisite enabled: (previously -m)
// define( 'WP_TESTS_MULTISITE', true );

// Force known bugs: (previously -f)
// define( 'WP_TESTS_FORCE_KNOWN_BUGS', true );

// Test with WordPress debug mode on (previously -d)
// define( 'WP_DEBUG', true );

// ** MySQL settings ** //

// This configuration file will be used by the copy of WordPress being tested.
// wordpress/wp-config.php will be ignored.

// WARNING WARNING WARNING!
// These tests will DROP ALL TABLES in the database with the prefix named below.
// DO NOT use a production database or one that is shared with something else.

define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'root' );
define( 'DB_PASSWORD', 'root' );
define( 'DB_Host', 'localhost:8889' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );

$table_prefix  = 'wp_';   // Only numbers, letters, and underscores please!

define( 'WP_TESTS_DOMAIN', 'example.org' );
define( 'WP_TESTS_EMAIL', '[email protected]' );
define( 'WP_TESTS_TITLE', 'Test Blog' );

define( 'WP_PHP_BINARY', 'php' );

define( 'WPLANG', '' );

しかし、テストスイートを実行しようとすると、phpunitがデータベースに接続できません。

$phpunit
...
<h1>Error establishing a database connection</h1>
<p>This either means that the username and password information in your <code>wp-config.php</code> file is incorrect or we can't contact the database server at <code>localhost:8889</code>. This could mean your Host's database server is down.</p>
...

誰もがこの問題をデバッグするのを手伝ってくれる?

**編集**

下記のようにwp-content/db-error.phpを追加した後。次のようなエラーが表示されます。

$ phpunit
PHP Warning:  mysql_error() expects parameter 1 to be resource, boolean given in /Users/spinlock/WordPress/wordpress-3.5.1/wp-includes/wp-db.php on line 1023
WordPress database error  for query  made by require_once('/Users/spinlock/WordPress/wordpress-3.5.1/wp-settings.php'), wp_set_wpdb_vars, dead_db, require_once('/Users/spinlock/WordPress/wordpress-3.5.1/wp-content/db-error.php')
Running as single site... To run multisite, use -c multisite.xml
PHP Warning:  mysql_error() expects parameter 1 to be resource, boolean given in /Users/spinlock/WordPress/wordpress-3.5.1/wp-includes/wp-db.php on line 1023
WordPress database error  for query  made by PHPUnit_TextUI_Command::main, PHPUnit_TextUI_Command->run, PHPUnit_TextUI_Command->handleArguments, PHPUnit_TextUI_Command->handleBootstrap, PHPUnit_Util_Fileloader::checkAndLoad, PHPUnit_Util_Fileloader::load, include_once('/Users/spinlock/WordPress/wordpress-tests/includes/bootstrap.php'), require_once('/Users/spinlock/WordPress/wordpress-3.5.1/wp-settings.php'), wp_set_wpdb_vars, dead_db, require_once('/Users/spinlock/WordPress/wordpress-3.5.1/wp-content/db-error.php')

wp-db.phpの1023行目はprint_error()の実装です。

1019   function print_error( $str = '' ) {
1020     global $EZSQL_ERROR;
1021
1022     if ( !$str )
1023       $str = mysql_error( $this->dbh );
1024     $EZSQL_ERROR[] = array( 'query' => $this->last_query, 'error_str' => $str );
1025

解決策

さて、私はようやくDB_Hostlocalhost:/Applications/MAMP/tmp/mysql/mysql.sockに変更することによってこれを機能させました。

そしてテストが実行されています。

$ phpunit
Installing...
Running as single site... To run multisite, use -c multisite.xml
Not running ajax tests... To execute these, use --group ajax.
PHPUnit 3.7.19 by Sebastian Bergmann.

Configuration read from /Users/spinlock/WordPress/wordpress-tests/phpunit.xml.dist

.............FFF................PHP Fatal error:  Call to undefined function wp_unslash() in /Users/spinlock/WordPress/wordpress-tests/tests/attachment/slashes.php on line 45

Fatal error: Call to undefined function wp_unslash() in /Users/spinlock/WordPress/wordpress-tests/tests/attachment/slashes.php on line 45
2
user341493

db-error.phpという名前のファイルをwp-contentディレクトリに置きます。ここで、グローバルな$wpdbオブジェクトに、より詳細なエラーを尋ねることができます。

global $wpdb;
$wpdb->print_error();

データベースハンドラの場合、これは最後のエラーメッセージを表示します。

1
fuxia