【问题标题】:NoMethodError: undefined method `expect' when trying to use it within a SitePrism classNoMethodError:尝试在 SitePrism 类中使用时未定义的方法“期望”
【发布时间】:2017-02-15 12:08:33
【问题描述】:

我有一个 cucumber、ruby、siteprism 项目,我们使用 'rspec' gem 来检查期望值。这包含在我们的 env.rb 中,并在步骤定义中成功使用。

我现在正试图在 SitePrism 类中做出一些断言,但出现错误。你知道我如何使用那些 expect() 方法吗? 我尝试在定义 SitePrism 类的 .rb 文件中使用 require 'rspec' 加上 include Rspec,但仍然遇到同样的错误:

expect(local_value).to eq(@previous_value)
=> Error: NoMethodError: undefined method `expect' for #<xxx_Object @loaded=false>

谢谢!

【问题讨论】:

  • 我在课堂上加入了include RSpec::Matchers ,这似乎传递了expect 错误消息。但是,然后我得到了另一个相关的,有什么建议可以解决这个错误,或者以不同的方式包含expect? NoMethodError: undefined method `map' for #<:matchers::builtin::all:0x000000067a5ac0> 你的意思是?点击

标签: ruby cucumber capybara site-prism


【解决方案1】:

正如您所发现的(从您的评论中),您可以在您的页面对象类中使用include RSpec::Matchers 来获取expect 以及RSpecs 默认匹配器。其中一个匹配器被命名为all,它会隐藏之前包含在对象中的 Capybara::DSL all 方法,并产生您所看到的错误。解决这个问题的方法是在 current_session 对象 (page) 或别名“find_all”上调用 all 的 Capybara 版本。所以all(...).map(...)变成了

page.all(...).map(...) # Same as Capybara.current_session.all(...)...

find_all(...).map(...)  # or page.find_all ...

【讨论】:

  • 这与您帮助我解决的关于 SitePrism 的另一个问题有关。 stackoverflow.com/questions/42236583/… 我只是在调用一个 siteprism 方法,而我自己没有调用 Capybara。您知道是否可以通过其他方式绕过此问题?
  • @mickael all 不是 site_prism 方法,而是 site_prism 包含在页面对象类中的 Capybara 方法。如果您说您的代码没有调用all,而是在site_prism 中的某个位置调用,那么您将需要使用site_prism 的主分支运行。去年年底有一个修复合并修复它 - github.com/natritmeyer/site_prism/pull/162
  • 我明白了,是的,它似乎是在使用部分时调用它的 site_prism。不过还有一个基本的疑问。我已经安装了 gem 2.9 版,并检查了 ruby​​gems.org,它似乎是最新的。如果尚未正式发布,您是否有关于如何将我的版本升级到 master 分支的链接? (我猜,我可以在本地覆盖一些文件,但该框架也被团队中的其他人使用)?
  • 在您的 gemfile 而不是 2.9 版本中,您可以指定 gem 'site_prism', git: 'https://github.com/natritmeyer/site_prism.git' 告诉它使用来自 github repo 的 master 分支(如果您需要除主)
  • 嗯......它似乎没有工作:*使用来自github.com/natritmeyer/site_prism.git的site_prism 2.9(在master@307d19e)*然后我在我的SitePrism页面中的方法中使用以下期望: expect(postcode).to eq("E1") * 得到了同样的错误:NoMethodError: undefined method `map' for #<:matchers::builtin::all:0x0000000563a5d8> 我做错什么了吗?从你的角度来看?
【解决方案2】:

老问题,但提供答案

在遵循 README 说明时也值得指出。 Cucumber 会将 RSpec 测试功能加载到 Cucumber 世界中。

取决于您与谁交谈以及在哪里交谈;最好(可以说)在 Cucumber World 中执行所有基于 RSpec 的功能测试(即在 step_definitions 中)。

此外,这样做可以避免您需要在任何地方包含这些项目,并且您将获得干净的步骤,例如 expect(my_page.header_message.text).to eq('This')

您也可以使用任何其他方法,包括自动创建的 capybara 方法,这些方法将使用隐式等待或从您的类的方法创建的 rspec 自动包含的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多