Skip to content

Instantly share code, notes, and snippets.

@nojimage
Created March 17, 2012 05:22
Show Gist options
  • Save nojimage/2055307 to your computer and use it in GitHub Desktop.
Save nojimage/2055307 to your computer and use it in GitHub Desktop.
NetBeansからでもCakePHP2のFixtureを読み込むためのNetBeansSuite魔改造
diff --git a/NetBeansSuite.php b/NetBeansSuite.php
index b3950af..72a3b03 100644
--- a/NetBeansSuite.php
+++ b/NetBeansSuite.php
@@ -139,6 +139,50 @@ class NetBeansSuite extends PHPUnit_Framework_TestSuite {
}
return $files;
}
+
+ protected function setUp() {
+ parent::setUp();
+
+ // load CakePHP fixture
+ if (class_exists('CakeFixtureManager')) {
+ $this->fixtureManager = $this->_getFixtureManager();
+ }
+ foreach ($this->getIterator() as $test) {
+ if ($test instanceof CakeTestCase) {
+ $this->fixtureManager->fixturize($test);
+ $test->fixtureManager = $this->fixtureManager;
+ }
+ }
+ }
+
+ protected function tearDown() {
+ // shutdown CakePHP fixture
+ if (isset($this->fixtureManager)) {
+ $this->fixtureManager->shutdown();
+ }
+ parent::tearDown();
+ }
+
+ /**
+ * Get the fixture manager class specified or use the default one.
+ *
+ * @return instance of a fixture manager.
+ */
+ protected function _getFixtureManager($arguments = array()) {
+ if (isset($arguments['fixtureManager'])) {
+ App::uses($arguments['fixtureManager'], 'TestSuite');
+ if (class_exists($arguments['fixtureManager'])) {
+ return new $arguments['fixtureManager'];
+ }
+ throw new RuntimeException(__d('cake_dev', 'Could not find fixture manager %s.', $arguments['fixtureManager']));
+ }
+ App::uses('AppFixtureManager', 'TestSuite');
+ if (class_exists('AppFixtureManager')) {
+ return new AppFixtureManager();
+ }
+ return new CakeFixtureManager();
+ }
+
}
?>
<?php
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2010 Oracle and/or its affiliates. All rights reserved.
*
* Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*
* Contributor(s):
*
* Portions Copyrighted 2009 Sun Microsystems, Inc.
*/
/**
* Generic test suite containing tests based on the provided CLI parameters,
* see {@link NetBeansSuite::toRun()} for more information.
*
* For directory:<br/>
* Recursively scans the test-directory and it's
* sub-directories. All found unit-tests will be
* added and executed.
*
* For file:<br/>
* Just the file is added.
*
* To run this suite from CLI: phpunit NetBeansSuite.php run=<file-or-directory>
*
* <b>WARNING: User changes to this file should be avoided.</b>
*
* @package NetBeans
*/
class NetBeansSuite extends PHPUnit_Framework_TestSuite {
/**
* The name of the parameter followed by equals sign ("=") of the file or directory to be run by PHPUnit.
* @see toRun()
*/
const RUN = "run=";
/**
* Suite factory.
*
* This function creates a PHPUnit test-suite,
* scans the directory for test-cases,
* adds all test-cases found and then returns
* a test-suite containing all available tests.
*
* @access public
* @static
* @return NetBeansSuite
*/
public static function suite() {
$suite = new NetBeansSuite();
foreach (self::toRun() as $file) {
$suite->addTestFile($file);
}
return $suite;
}
/**
* Tries to find {@link #RUN) in CLI parameters and returns array of files to be runj by PHPUnit
* or throws Exception if no such parameter found or directory/file does not exist.
*
* @access private
* @static
*
* @return array an array of files to be run by PHPUnit
* @see RUN
*/
private static function toRun() {
$argv = isset($_SERVER['argv']) ? $_SERVER['argv'] : array();
$run = null;
foreach ($argv as $arg) {
if (preg_match("/^\"?".self::RUN."(.+?)\"?$/", $arg, $sub)) {
$run = $sub[1];
break;
}
}
if ($run === null) {
throw new Exception("No argument to run found.");
}
if (is_dir($run)) {
return self::rglob("*[Tt]est.php", $run.DIRECTORY_SEPARATOR);
} elseif (is_file($run)) {
return array($run);
}
throw new Exception(sprintf("Argument '%s' neither file nor directory.", $run));
}
/**
* Recursive {@link http://php.net/manual/en/function.glob.php glob()}.
*
* @access private
* @static
*
* @param string $pattern the pattern passed to glob(), default is "*"
* @param string $path the path to scan, default is
* {@link http://php.net/manual/en/function.getcwd.php the current working directory}
* @param int $flags the flags passed to glob()
* @return array an array of files in the given path matching the pattern.
* @link http://php.net/manual/en/function.glob.php
* @link http://php.net/manual/en/function.getcwd.php
*/
private static function rglob($pattern = '*', $path = '', $flags = 0) {
$paths = glob($path.'*', GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT) or array();
$files = glob($path.$pattern, $flags) or array();
foreach ($paths as $path) {
$files = array_merge($files, self::rglob($pattern, $path, $flags));
}
return $files;
}
protected function setUp() {
parent::setUp();
// load CakePHP fixture
if (class_exists('CakeFixtureManager')) {
$this->fixtureManager = $this->_getFixtureManager();
}
foreach ($this->getIterator() as $test) {
if ($test instanceof CakeTestCase) {
$this->fixtureManager->fixturize($test);
$test->fixtureManager = $this->fixtureManager;
}
}
}
protected function tearDown() {
// shutdown CakePHP fixture
if (isset($this->fixtureManager)) {
$this->fixtureManager->shutdown();
}
parent::tearDown();
}
/**
* Get the fixture manager class specified or use the default one.
*
* @return instance of a fixture manager.
*/
protected function _getFixtureManager($arguments = array()) {
if (isset($arguments['fixtureManager'])) {
App::uses($arguments['fixtureManager'], 'TestSuite');
if (class_exists($arguments['fixtureManager'])) {
return new $arguments['fixtureManager'];
}
throw new RuntimeException(__d('cake_dev', 'Could not find fixture manager %s.', $arguments['fixtureManager']));
}
App::uses('AppFixtureManager', 'TestSuite');
if (class_exists('AppFixtureManager')) {
return new AppFixtureManager();
}
return new CakeFixtureManager();
}
}
?>
<?php
/**
* Web Access Frontend for TestSuite
*
* PHP 5
*
* CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing>
* Copyright 2005-2011, Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice
*
* @copyright Copyright 2005-2011, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://book.cakephp.org/view/1196/Testing
* @package app.webroot
* @since CakePHP(tm) v 1.2.0.4433
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
set_time_limit(0);
ini_set('display_errors', 1);
/**
* Use the DS to separate the directories in other defines
*/
if (!defined('DS')) {
define('DS', DIRECTORY_SEPARATOR);
}
/**
* These defines should only be edited if you have cake installed in
* a directory layout other than the way it is distributed.
* When using custom settings be sure to use the DS and do not add a trailing DS.
*/
/**
* The full path to the directory which holds "app", WITHOUT a trailing DS.
*
*/
if (!defined('ROOT')) {
define('ROOT', dirname(dirname(dirname(__FILE__))));
}
/**
* The actual directory name for the "app".
*
*/
if (!defined('APP_DIR')) {
define('APP_DIR', basename(dirname(dirname(__FILE__))));
}
/**
* The absolute path to the "Cake" directory, WITHOUT a trailing DS.
*
* For ease of development CakePHP uses PHP's include_path. If you
* need to cannot modify your include_path, you can set this path.
*
* Leaving this constant undefined will result in it being defined in Cake/bootstrap.php
*/
//define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');
/**
* Editing below this line should not be necessary.
* Change at your own risk.
*
*/
if (!defined('WEBROOT_DIR')) {
define('WEBROOT_DIR', basename(dirname(__FILE__)));
}
if (!defined('WWW_ROOT')) {
define('WWW_ROOT', dirname(__FILE__) . DS);
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
if (function_exists('ini_set')) {
ini_set('include_path', ROOT . DS . 'lib' . PATH_SEPARATOR . ini_get('include_path'));
}
if (!include('Cake' . DS . 'bootstrap.php')) {
$failed = true;
}
} else {
if (!include(CAKE_CORE_INCLUDE_PATH . DS . 'Cake' . DS . 'bootstrap.php')) {
$failed = true;
}
}
if (!empty($failed)) {
trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR);
}
if (Configure::read('debug') < 1) {
die(__d('cake_dev', 'Debug setting does not allow access to this url.'));
}
require_once CAKE . 'TestSuite' . DS . 'CakeTestSuiteDispatcher.php';
require_once CAKE . 'TestSuite' . DS . 'CakeTestSuiteCommand.php';
@nojimage
Copy link
Author

suite()と_getFixtureManager()メソッドの追加。

NetBeansSuite.php の場所は、OSX版なら NetBeans 7.1.app/Contents/Resources/NetBeans/php/phpunit
Windows版とかLinux版はシリマセン

@nojimage
Copy link
Author

phpunit.php はブートストラップファイルとして指定。

app/webroot/配下に置く用 (test.phpの最後の2行を書き換えただけ)。

@nojimage
Copy link
Author

なんか違うようなので書き直し中

@nojimage
Copy link
Author

書き直した。スッキリ。

@junichi11
Copy link

Windows版はユーザのディレクトリ.netbeans\7.1\phpunit
にあります。

@nojimage
Copy link
Author

情報ありがとうございます!

一応バージョンアップした場合に備えて、パッチファイルも置いておきました。

@junichi11
Copy link

2つのファイルをNBのプラグインに取り込んでもよろしいでしょうか?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment