这是我的html:
<li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<i class="fa fa-user"></i> Register / Login <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li>
<a href="/sign_in"><i class="fa fa-fw fa-circle-o"></i> login </a>
</li>
<li>
<a href="/sign_up"><i class="fa fa-fw fa-circle-o-notch"></i> Register </a>
</li>
<li class="divider"></li>
</ul>
</li>
这是我的期望:
it { should have_link 'Register', href: registration_path }
但是,即使注册链接明显存在,规范也会失败。如果我将链接移出<ul>
,就像这样:
<a href="/sign_up"><i class="fa fa-fw fa-circle-o-notch"></i> Register </a>
<li class="dropdown">
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<i class="fa fa-user"></i> Register / Login <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li>
<a href="/sign_in"><i class="fa fa-fw fa-circle-o"></i> login </a>
</li>
<li>
</li>
<li class="divider"></li>
</ul>
</li>
规范通过。这是为什么?
答案 0 :(得分:1)
我猜你正在使用水豚。
Capybara不会发现隐藏的元素。 您需要点击&#39;。dropdown-toggle&#39;元素,然后检查&#39;注册&#39;链接。 这只适用于使用javascript驱动程序(selenium,poltergeist等)
这是好方法 - 您正在模拟真实的用户行为。 但是,您可以尝试change capybara's behavior
it "should have Register link", js: true do
find('.dropdown-toggle').click
expect(page).to have_link('Register', href: registration_path)
end