gpt4 book ai didi

ruby - RSpec HaveSelector 在使用 Capybara 时无法正常工作

转载 作者:数据小太阳 更新时间:2023-10-29 07:34:19 26 4
gpt4 key购买 nike

Capybara 的 HaveSelector 没有按照我期望的方式与 RSpec expect 一起工作。我是 Capybara 和 RSpec 的新手,所以这很可能是我对 RSpec 或 Capybara 的误解,或者它可能是 Capybara(版本 2.0.2)的缺陷。请帮助我理解我的错误或编写错误报告/功能请求。

在我的 RSpec 中我写道:

expect { click('.special-div .submit') }.to have_css('.submitted')

我希望这在功能上等同于

click('.special-div .submit')
page.should have_css('.submitted')

但事实并非如此。相反,匹配器 have_css 尝试匹配 proc 对象的字符串转换,而不是调用 proc 对象的结果。 (换句话说,永远不会执行 click('.special-div .submit')。)

capybara 的行为是:

  • 很合理
  • capybara 缺失特征的例子
  • capybara 2.0.2 中的一个错误
  • 还有别的吗?

此外,我显然可以通过使用上面的两行版本来做我想做的事,但我们的团队正试图在 expect {} 上进行标准化,所以有没有办法使用 expect {} 形式并让它做我想做的事?

编辑

我继承了我正在使用的代码,所以我没有意识到,正如 Andrey Botalov 指出的那样,click 不是 Capybara 的标准部分。看起来应该如此,但是 click 已经被大量用于其他事情,所以 Capybara 不添加另一个定义可能更好。

由于有些人似乎持怀疑态度,所以让我向您保证这段代码工作正常:

click('.special-div .submit')
page.should have_css('.submitted')

对于那些想知道 have_css() 的人来说,这就是 has_css? 的 RSpec 魔法。对于那些对 click 感到疑惑的人,在我的项目中,有人方便地创建了 click 函数,如下所示:

  def click(css)
page.execute_script("$('#{css}').first().trigger('click');")
end

为什么?因为没有一个明显的替代方案有效。

click_on('.special-div .submit')  # Fails because click_on does not take CSS
# Cannot use click_button() because we are clicking on a <div>
find('.special-div .submit').click # Raises exception because there are more than one
first('.special-div .submit').click # Fails because the div is not visible

继续前进,@zetetic 问是否

expect(click('.special-div .submit')).to have_css('.submitted')

会起作用。不,它对我们不起作用,因为我们仍在使用 RSpec 2.9 并且该语法是在 2.11 中引入的,但即使我们升级它仍然不起作用,因为 click 不返回对象.如果我们升级到 2.11 并更改 click 以返回 page,它可能会起作用。

最佳答案

expect { click('.special-div .submit') }.to have_css('.submitted') 有几个问题这就是为什么我很困惑。

最让我困惑的是 RSpec 的 expect {...}.to ...句法。我认为这种语法会导致匹配器运行 {} 中的代码并将匹配器应用于结果或类似的东西。似乎有道理 the example :

expect { something }.to raise_error(SomeError)

事实证明这通常不是真的。只有某些匹配器期望“实际”('expect' 和 '.to' 之间的)是 Proc然后调用它。大多数匹配器期望“实际”是一个对象。所以:

expect { 1 + 1 }.to eq(2)

引发异常试图比较 ProcFixnum .

所以 capybara 的 has_css? matcher 完全合理地期望“实际”是响应 has_selector? 的对象而不是 Proc .这确实是我的主要问题,这样一来, capybara 就摆脱了困境。

让我更加困惑的是,Capybara 提供了一个 DSL,因此在我的示例中 has_css?相当于page.has_css?这让我期待 have_css(css)将继续神奇地对page进行操作.

关于编写测试的更好方法。 @deviousdodo 基本上是对的,这就是为什么我要为那个答案颁发奖金。我想要的是

expect {
click('.special-div .submit')
}.to change { page.has_css?('.submitted') }.from(false).to(true)

其实虽然超出了原题的范围,但我真正想要的是

expect { 
click('.special-div .submit')
page.should have_css('.submitted')
}.to change { Click.count }.by 1

我想要这个的原因是因为我最想检查的是点击被记录在数据库中(Click.count 递增)但是我必须等待点击触发的 AJAX 调用完成,这是完成的通过 has_css? .

关于ruby - RSpec HaveSelector 在使用 Capybara 时无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15672088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com