【问题标题】:How to mock method call inside another method call如何在另一个方法调用中模拟方法调用
【发布时间】:2021-11-14 04:35:05
【问题描述】:

我有以下代码:

 def do_something(param1, param2)
    "hello" if current_page? param2
  end

但是,当我在帮助规范中执行此操作时,上面的应用程序代码可以工作:

allow(helper).to receive(:current_page?).and_return(true)

它不工作它说You cannot use helpers that need to determine the current page unless your view context provides a Request object in a #request method

但是当我这样做时

 allow(self).to receive(:current_page?).and_return(true)

它有效。这是怎么回事?在这种情况下,self 不是辅助规范类吗?为什么我不能显式引用助手?

【问题讨论】:

  • 你能发布更多上下文吗?现在我们甚至不知道这行代码的范围

标签: ruby-on-rails rspec mocking stub


【解决方案1】:

我猜你把期望称为如下

RSpec.describe ApplicationHelper, type: :helper do
  describe "#hello" do
    it "returns hello" do
      expect(do_something).to eq("hello")
    end
  end
end

当你describe一个测试用例时,你创建一个RSpec::Rails::{type}ExampleGroup,这里的类型是helper,所以你创建一个RSpec::Rails::HelperExampleGroup,这个example_group wrap a helper that is your ApplicationHelper。除此之外,这个example_group 可以响应你助手的所有方法

RSpec.describe ApplicationHelper, type: :helper do
  # ...
  it "returns hello" do
    puts self # RSpec::ExampleGroups::ApplicationHelper::...
    puts self.respond_to?(:do_something)  # true
    puts self.respond_to?(:current_page?)# true

    puts self.helper.is_a?(ApplicationHelper) # true
  end 

这里current_page? 是属于模块ActionView::Helpers::UrlHelper 的特殊方法,这是一个人提出你遇到的错误。

因此,当您直接调用 expect(do_something) 时,您正在调用 expect(example_group.do_something) 并且对象在方法 do_something 中调用方法 current_page? 是 example_group,如果您没有在example_group 对象,这将引发错误。这就是为什么当你模拟 allow(self).to receive(:current_page?).and_return(true) 时你的测试用例会通过。

现在,如果您在 helper 方法上模拟此方法并使用 helper 调用 do_something,那么您的测试用例将通过,因为 helper.do_something 相当于 self.helper.do_something,实际上是 example_group.helper.do_something

allow(helper).to receive(:current_page?).and_return(true)
expect(helper.do_something).to eq("hello")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多