【问题标题】:Rspec - Mock the model methodRspec - 模拟模型方法
【发布时间】:2020-03-23 08:27:05
【问题描述】:

我有以下方法,

模型/Summary.rb

def show_summary
    device_lastest_reading = lastest_reading
  end

模型/Reading.rb

def lastest_reading
    select_readings(start_date, last_date)
  end

lastest_reading 方法从硬件获取值。我为 RSPEC 创建了一个DummyReading.rb 并放置了lastest_reading 方法,如下所示,

DummyReading.rb

def lastest_reading
    {
      :a=>13,
      :b=>"7666",
      :c=>6729690,
    }
  end

这是我尝试过的,

it "should return summary data" do
        allow(DummyReading.lastest_reading).to receive(Model.show_summary).and_return({})
      end

我收到错误“undefined methodto_sym' for {}:Hash`”

在 rspec 中如何模拟/存根这个 device_lastest_reading 变量。

谢谢。

【问题讨论】:

  • 我不明白你认为这段代码会如何运行。您在阅读中定义latest_reading,但您在摘要中调用它,就好像它在该类的实例方法中一样。您能否通过将实际类编写为最小的 RUNNABLE 示例来澄清这一点?为什么文件扩展名是.cs 而不是rb?你也不需要为你的测试创建一个单独的类。改用instance double 来模拟协作者。
  • @max 在 show_summary 方法中执行 RSPEC 期间,我需要从 DummyReading.rb -> lastest_reading 方法而不是 Model/Reading.rb -> lastest_reading 方法获取值。他们有什么办法我可以做到这一点。
  • 您能否按要求编辑问题,使代码实际上可以理解/运行?再次重复同样的问题并没有帮助。我不傻。 stackoverflow.com/help/how-to-ask
  • 我想告诉你的是Model.show_summary 会给出一个无方法错误,因为它是一个实例而不是类方法。即使这样做了,它也会在lastest_reading 上出错,因为该方法是在完全不同的类中定义的。如果您甚至不了解 OOP 的基础知识,那么 Mocking 真的是无关紧要的。

标签: ruby-on-rails rspec


【解决方案1】:

正如@max 所提到的,你应该在提问之前做适当的功课。首先了解 mocking 和 stubbing 之间的区别以及它如何与 rspec 一起使用。

为了获得快速帮助,以下应该可以工作。

it "should return summary data" do
  allow_any_instance_of(Reading).to receive(:latest_reading).and_return(DummyReading.new.latest_reading)
end

虽然不推荐allow_any_instance_of。结帐style guide

【讨论】:

    猜你喜欢
    • 2011-02-17
    • 2021-08-27
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多