尝试调用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(AppEmployee::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>
.