我遇到了一个很奇怪的问题。
我有两个类,一个在 App \ Projects \ github \ Units \ github_login 中,另一个在 App \ Projects \ github \ Schema \ github_login
中>Schema文件只是一个方案,它显示文件 App \ Projects \ github \ Units \ github_login 的骨骼结构。
实际上,它永远不应该被加载和执行,只适合人类使用。
但是,PHP总是执行此文件,而不是 App \ Projects \ github \ Units \ github_login
namespace App\Http\Controllers;
use App\Models\Selenium;
use App\Models\Project;
use App\Projects\github\Units\github_login;
class PlayController extends BasePlayController
{
private $github_login;
function __construct()
{
parent::__construct();
$this->github_login = new github_login();
}
/**
* Play a testcase X times.
*
* @param string $Project
* @param string $Unit
* @param string $Scenario
* @param string $Testcase
* @param int $Times
* @param int $Delay
* @return /Illuminate/View/View
*/
public function PlayCase($Project, $Unit, $Scenario, $Testcase, $Times=1, $Delay=3)
{
$SeleniumObj = $this->Selenium;
$Unit = $Project .'_'. $Unit;
switch ($Project) {
case 'github':
switch ($Unit) {
case 'github_login':
switch ($Scenario) {
case 'standard':
$this->callCase(array($this->github_login, 'standard'), $Testcase, $Times, $Delay);
break;
default:
$SeleniumObj->logMessage[$SeleniumObj->index]['TestcaseTitle'] = $Scenario;
$SeleniumObj->setMessage(2,"Das Szenario '<strong>". $Scenario ."</strong>' existiert nicht!", '');
}
break;
}
break;
default:
$SeleniumObj->setTitle('Projekt existiert nicht.');
$SeleniumObj->setMessage(2,'Das Projekt <strong>'. $Project .'</strong> existiert nicht. (Fix: einfach neuen Testfall anlegen)', '');
}
return view('show.report')->with('driver', $SeleniumObj->driver)
->with('ScenarioName', $Scenario)
->with('logMessage', $SeleniumObj->logMessage)
->with('execScriptRet', $SeleniumObj->execScriptRet)
->with('screenshot', $SeleniumObj->screenshot)
->with('PlayAll', false);
}
如您在屏幕快照中所见,它甚至加载了正确的文件,但是到底如何执行文件夹Schema
中的文件?
我正在进行硒测试,并使用github登录页面进行启动。
BasePlayController-callCase:
namespace App\Http\Controllers;
use App\Models\Selenium;
class BasePlayController
{
public $Selenium;
function __construct()
{
$this->Selenium = new Selenium();
}
public function callCase($thisFunction, $Testcase, $Times=1, $Delay=1)
{
$SeleniumObj = $this->Selenium;
if (is_numeric($Times)) {
for($i = 1; $i <= $Times; $i++) {
$thisFunction($SeleniumObj, $Testcase);
sleep($Delay);
}
} else {
$SeleniumObj->logMessage[$SeleniumObj->index]['TestcaseTitle'] = 'Falscher Parameter für Times.';
$SeleniumObj->setErrorMessage("Times muss eine Zahl sein! (Gegeben: '<strong>". $Times ."</strong>')", '');
}
}
...
vendor \ composer \ autoload_classmap.php
中的自动加载程序条目'App\\Projects\\github\\Units\\github_login' => $baseDir . '/app/Projects/github/Schema/github_login.php',
我试图将其更改为
'App\\Projects\\github\\Units\\github_login' => $baseDir . '/app/Projects/github/Units/github_login.php',
但这没什么区别。
答案 0 :(得分:1)
假设您有2个文件声明了相同的类。 Composer正在扫描目录以查找类并将类映射到其位置。碰巧是因为每个键只能指向Schema
中的重复类。不用深入了解内部情况,这就是我的快速想法。
该文件说它在X名称空间中,而类名是Y ...不管它实际存在于哪里,都是这样。
我想您不能有2个文件声明相同的类(在有类映射的文件夹中的任何地方),或者使重复的文件不是有效的php文件,也许将其设为.phps
。
...并减少自动加载。
答案 1 :(得分:0)
我找到了原因。我不得不从{p>更改vendor\composer\autoload_static.php
中的自动加载器条目
'App\\Projects\\github\\Units\\github_login' => __DIR__ . '/../..' . '/app/Projects/github/Schema/github_login.php',
到
'App\\Projects\\github\\Units\\github_login' => __DIR__ . '/../..' . '/app/Projects/github/Units/github_login.php',
但是我想知道为什么我必须手动执行此操作。