Laravel 5.1 PHPUnit - press() 给我返回 'Unreachable field ""'

12

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

无法访问字段""的无效参数异常。

出现在该行。

根据文档:

按照给定的文本或名称“按下”按钮。

我的方法:

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() !!}

正如您所看到的,我的字段没有超出表单范围。


我遇到了类似的问题。可能与客户端验证失败有关。 - PapaHotelPapa
我认为问题不在于按钮,而在于表单中提交的其他字段。双引号“”提示可能与具有数组名称的输入相关(例如,name="email[]")。您能否发布一下您的表格样本? - WebSpanner
如果您的输入具有WebSpanner所述的数组名称,则可以为其分配一个ID,该ID与名称相同但不包括数组声明,并且在PHPUnit中引用输入时不需要使用方括号。这应该解决您的问题并允许PHPUnit看到提交按钮。 - PFY
5个回答

6
我不确定您的问题的确切原因,但可能有几个原因。 我会评论,但我还没有足够的声望。
首先,您是否通过验证器运行了纯html? 如果出现任何语法错误,请尝试修复它们并再次运行单元测试。 (您可以尝试使用https://validator.w3.org/,只需复制并粘贴您的html)
另一个原因可能是您有一些修改DOM的javascript,而Laravel测试无法处理。
最后,您可以尝试将<button>的'value'属性设置为“Create”。
<button class="btn btn-lg btn-primary" type="submit" name="submit" value="Create">Create</button>

或者将<button>标签改为<input>标签,同时给<input>标签添加属性type="submit"value="Create"

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

5

根据经验,无法访问的字段错误通常是由于按钮在<form>元素之外引起的。我有一个类似的场景,其中页面的另一部分通过$request传递给控制器,但是因为它不在与其他内容相同的直接表单元素内,PHPUnit不能将其与表单相关联。

可能值得将方法从press()更改为click(),后者只是在寻找可以点击的任何东西,而不是尝试将提交按钮与表单匹配。

如上所述,如果您正在使用JavaScript,则PHPUnit本身无法测试JavaScript,您需要像Selenium这样的工具来完成。

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


那就是情况。我有两个表单:标准表单和Ajax表单。无法测试Ajax表单,但那就是问题所在。 - Rav

0

你可能会发现它可以使用submitForm方法:

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

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浏览器上右键单击检查的源代码。您需要的选项是复制 > 复制为XPath


-1
这主要原因是当您拥有类似于以下内容的提交按钮时。 <button type="submit" name="submit" class="btn btn-primary">提交</button>。当您将按钮文本更改为除提交以外的其他文本时,它将正常工作。例如:<button type="submit" name="submit" class="btn btn-primary">创建</button>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接