Laravel 5.1 PHPUnit - press()给我'Unreachable field“”'

时间:2015-12-01 00:54:45

标签: php laravel testing phpunit laravel-5.1

尝试调用press()方法时,我总是得到

  

InvalidArgumentException:无法访问的字段“”

在那条线上。

根据文件:

  

“按”具有给定文字或名称的按钮。

我的方法:

press('Create') 

我的按钮是

<button class="btn btn-lg btn-primary" type="submit" name="submit">Create</button> 

我也尝试使用name,结果相同。

我也试过了submitForm('Create'),但后来seeInDatabase('employees', ['email' => 'john@email.com'])总是失败。

  

无法在数据库表[employees]中找到与属性[{“email”:“john@email.com”}]匹配的行。

这是我的完整方法

public function testExample()
{

  $this->actingAs(\App\Employee::where('username', 'grant')->first())
    ->visit('/employees/create')
    ->type('john', 'username')
    ->type('1234', 'password')
    ->type('john@email.com', 'email')
    ->submitForm('Create')
    ->seeInDatabase('employees', ['email' => 'john@email.com'])
    ->see('Employee Directory');
}

更新1

这是我的表格:

{!! Form::open(['route' => 'employees.store', 'method' => 'POST']) !!}
  @include('employees.form')
{!! Form::close() !!}

正如您所看到的,我的字段无法在表单之外。

5 个答案:

答案 0 :(得分:5)

我不确定问题的确切原因是什么,但可能是一些问题。 我会评论,但我还没有足够的声誉。

首先,您是否通过验证器运行普通的HTML?如果它给你任何语法错误,请尝试修复它们并再次运行单元测试。 (您可以尝试这个https://validator.w3.org/,只需复制并粘贴您的HTML)

另一个原因可能是你有一些修改你的DOM的JavaScript,而Laravel测试无法处理它。

最后,您可以尝试设置&#39;值&#39;您dbServersList=('db001:app001,app002,app003' 'db002:app004,app005' 'dbcentral:central') # Loop over DB servers for someDbServer in ${dbServersList[@]} do # delete previous array/list (this is crucial!) unset dbNamesList # split sub-list if available if [[ $someDbServer == *":"* ]] then # split server name from sub-list tmpServerArray=(${someDbServer//:/ }) someDbServer=${tmpServerArray[0]} dbNamesList=${tmpServerArray[1]} # make array from simple string dbNamesList=(${dbNamesList//,/ }) fi # Info echo -e "\n----\n$someDbServer\n--" # Loop over databases for someDB in ${dbNamesList[@]} do echo $someDB done done 至&#34;创建&#34;

的属性
----
db001
--
app001
app002
app003

----
db002
--
app004
app005

----
dbcentral
--
central

或者将<button>改为<button class="btn btn-lg btn-primary" type="submit" name="submit" value="Create">Create</button> <button>属性<input>type改为"submit"

value

答案 1 :(得分:5)

根据经验,无法访问的字段错误通常是由于按钮位于<form>元素之外,我有一个类似的场景,页面的另一部分通过{{1传递给控制器但是因为它不在其他所有内容的同一个直接表单元素中,所以PHPUnit不能用表单对它进行协调。

可能值得将方法从$request更改为press(),它只是寻找可以点击的内容,而不是尝试将提交按钮与表单匹配。

如上所述,PHPUnit不能自己测试JavaScript(如果你当然使用Javascript),你需要像Selenium那样做。

如果没有标记,很难说,你可以发布表单的标记吗?

答案 2 :(得分:0)

这样做的主要原因是你有一个如下所示的提交按钮。 <button type="submit" name="submit" class="btn btn-primary">Submit</button>。当您将按钮的文本更改为除提交之外的其他文本时,它将正常工作。例如<button type="submit" name="submit" class="btn btn-primary">Create</button>

答案 3 :(得分:0)

  

以前的建议不包括让两个提交按钮具有相同值的业务需求。

我们需要做的是,覆盖默认的Laravel XPath表达式。

我们不会找到带有文本的第二个提交按钮的第一个实例,而是告诉Laravel找到具有我们特定XPath的元素(第二个提交按钮)。

    $this->visit(route('user.login'));

    // replace `login-btn-2` with the id of your second button
    $button = $this->crawler->filterXPath('//*[@id="login-btn-2"]'); 

    $form = $button->form($inputs = ['email' => $user->email, 'password' => $password,]);

    $this->makeRequestUsingForm($form);

    $this->see(route('user.loggedin.dashboard'));

额外信用如果您是XPath新手,可以右键点击Chrome浏览器上经过检查的源代码。您想要的选项是Copy&gt; Copy as XPath

答案 4 :(得分:0)

您可能会发现它可以与submitForm方法一起使用:

$this->submitForm('Create', ['username' => 'john']);