Laravel 5.1 PHPUnit - press() 给了我 '无法访问的字段 “”'


Laravel 5.1 PHPUnit - press() gives me 'Unreachable field ""'

尝试调用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'])总是失败。

无法在数据库表 [雇员] 中找到与属性 [{"电子邮件":"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() !!}

如您所见,我的字段不可能在表单之外。

我不确定您问题的确切原因是什么,但可能是几件事。我会发表评论,但我还没有足够的声誉。

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

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

最后,您可以尝试将<button>的"value"属性设置为"创建">

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

或者将<button>更改为具有属性"submit" type value "Create"<input>

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

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

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

如上所述,PHPUnit 不能单独测试 JavaScript(当然,如果你使用的是 Javascript(,你需要像 Selenium 这样的东西来做到这一点。

没有标记,很难

说,您可以发布表单的标记吗?

前面的建议未涵盖具有相同值的两个提交按钮的业务需求。

我们需要做的是,覆盖默认的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> Copy as XPath

您可能会发现它适用于submitForm方法:

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

造成这种情况的主要原因是当您有如下所示的提交按钮时。 <button type="submit" name="submit" class="btn btn-primary">Submit</button> .当您将按钮的文本更改为"提交"以外的其他文本时,它将正常工作。例如<button type="submit" name="submit" class="btn btn-primary">Create</button>.