首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保存接受rspec中的块的方法调用

保存接受rspec中的块的方法调用
EN

Stack Overflow用户
提问于 2015-03-16 08:47:17
回答 1查看 1.9K关注 0票数 3

我有这样一个lib方法:

代码语言:javascript
复制
  def search(*args, &blk)
    MyGem.search(*args, &blk)
  end

我有另一个调用此搜索方法的方法如下:

代码语言:javascript
复制
  def members_of(dept)
    result = {}
    search(:attributes => ["displayname", "employeeID"]) do |entry|
      result[entry.employeeid.first.to_i] = entry.displayname.first.to_s
    end
    result
  end

当我为members_of编写rspec测试时,我试图对search调用进行存根处理。但我不知道如何准确地对该块进行存根处理,因为该块实际上使用了方法中定义的一个局部变量。任何帮助都将不胜感激。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-17 14:19:56

如果使用rspec-模拟,则可以使用部分试验双MyGem.search进行存根方法调用。

部分测试双是系统中实际对象的扩展,该系统在测试上下文中具有测试-双类行为。这种技术在Ruby中非常常见,因为我们经常看到类对象充当方法的全局命名空间。

若要对MyGem进行部分加倍,并期望调用其search类方法,请执行以下操作:

代码语言:javascript
复制
expect(MyGem).to receive(:search)

然后,您可以在这个双检查调用参数上添加附加行为,使其成为收益率值引起错误

代码语言:javascript
复制
# match arguments
expect(MyGem).to receive(:search).with(:attributes => ["displayname", "employeeID"])
# yield value
expect(MyGem).to receive(:search).and_yield(42)
# yield multiple values
expect(MyGem).to receive(:search).and_yield(42).and_yield(987)
# raise an error
expect(MyGem).to receive(:search).and_raise(ArgumentError, "bad request")
# all at once!
expect(MyGem).to receive(:search).with(:attributes => ["displayname", "employeeID"])
    .and_yield(42)
    .and_raise(ArgumentError, "bad request")

根据您的信息(这似乎是不完整的:从未使用过dept参数.),下面是一个完全工作的示例:

代码语言:javascript
复制
Entry = Struct.new(:employeeid, :displayname)

class MyGem
  def self.search(*args)
    yield Entry.new([1, 2, 3], ["one", "two", "three"])
  end
end

class Organization
  def search(*args, &blk)
    MyGem.search(*args, &blk)
  end

  def members_of(dept)
    result = {}
    search(:attributes => ["displayname", "employeeID"]) do |entry|
      result[entry.employeeid.first.to_i] = entry.displayname.first.to_s
    end
    result
  rescue
    []
  end
end

RSpec.describe Organization do
  describe "#members_of" do
    it "calls search" do
      organization = Organization.new
      expect(MyGem).to receive(:search).with(:attributes => ["displayname", "employeeID"])
          .and_yield(Entry.new([1337, 100, 2000], ["leet", "one hundred", "two thousand"]))
          .and_yield(Entry.new([123], ["one-two-three"]))
      members = organization.members_of("dept")
      expect(members).to match({
          1337 => "leet",
          123 => "one-two-three"})
    end
    it "returns empty array on search error" do
      organization = Organization.new
      expect(MyGem).to receive(:search).and_raise(ArgumentError)
      expect(organization.members_of("dept")).to eq([])
    end
  end
end

此外,在使用部分双倍时,应该启用verify_partial_doubles配置选项,以确保不存在不存在的类方法。在您的spec/spec_helper.rb文件中使用此片段启用它:

代码语言:javascript
复制
RSpec.configure do |config|
  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29072668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档