【问题标题】:Ruby rspec mocking a class with an attribute that is a hashRuby rspec模拟具有哈希属性的类
【发布时间】:2018-04-09 15:30:01
【问题描述】:

我有一个正在测试的类,叫它 myfoo。它访问一个名为 yourbar 的类。具体是这样的......

yourbar_obj.projects[project_name]

在我的规范代码中我有这个

let(:yourbar_obj) { Class.new }

我想模拟它以响应哈希属性访问。 所以我尝试了这个

expect(yourbar_obj).to receive(projects).and_return(some_obj)

但是当我运行代码时它说

NoMethodError: undefined method `projects' ...

是否可以像这样模拟哈希访问?相同类型的东西适用于常规方法调用。 我什至尝试添加一个 .with(project_name) 以防万一。同样的错误。 想法?

【问题讨论】:

  • 使用receive(:projects) - 您将方法名称作为符号传递。这与哈希无关,receive 总是这样
  • with(project_name) 在这里也没有意义。如果你想模拟 [project_name] getter 调用,你可以使用 expect(projects).to receive(:[]).with(project_name).and_return(whatever)
  • 哇。我怎么错过了。
  • 好吧,它不喜欢 :projects... 在 [] 上有一个未定义的方法。所以我像这样添加了。 with(projects[]) 这让我的参数数量错误。
  • 如果您可以显示您收到的“[] 上的未定义方法”以及您的确切尝试,那将是有用的,但无论如何,with(projects[]) 是错误的,你为什么要把[]最后呢?

标签: ruby unit-testing hash rspec


【解决方案1】:

感谢麦克斯的帮助。这是正确答案...

some_hash_obj[project_name] = some_obj
expect(yourbar_obj).to receive(:projects).and_return(some_hash_obj)

两个关键部分。 : 在项目之前,并且 some_hash_obj 必须是哈希。我试图一次返回哈希索引处的值(这是一个 obj),但这不是它的工作原理。返回哈希, [] 将应用于它。

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 2021-07-15
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多