Rspec "NoMethodError" 来自嵌套模块

Rspec "NoMethodError" from nested module

我 运行 遇到了一个奇怪的错误:

Class:

module AnimalSanctuary
  module AnimalInspector
    class AnimalPicker

   def initialize(number_of_animals, ids)
     @number_of_animals = number_of_animals
     @ids = ids
    end

     ...
     def pick_animals(animal)
     end 
  end
end

测试:

require 'rails_helper'

RSpec.describe AnimalSanctuary::AnimalInspector::AnimalPicker do
  describe ".pick_animals" do
    context "pick an available animal" do
      it "returns animal name" do
        expect(AnimalSanctuary::AnimalInspector::AnimalPicker.pick_animals("Dog")).to eq("Dog")
      end
    end
  end
end

我收到以下错误:

NoMethodError:
       undefined method `pick_animals' for AnimalSanctuary::AnimalInspector::AnimalPicker:Class

Rspec 调用 class 但不是让我难过的方法。我做错了什么吗?

pick_animals的定义是一个实例方法

要调用它,您需要使用 new 方法实例化 class 的对象,如下所示。我已将随机值传递给您的初始值设定项 (1, [1,2]) 但是您可以随意设置它们。:

number_of_animals = 1
ids = [1,2]
AnimalSanctuary::AnimalInspector::AnimalPicker.new(number_of_animals, ids).pick_animals("Dog")

否则,要按照您调用它的方式调用它,您需要使用 self.pick_animals 将其重新定义为 class 方法,如图所示以下:

module AnimalSanctuary
  module AnimalInspector
    class AnimalPicker

     ...
     def self.pick_animals(animal)
     end 
  end
end

是的pick_animals是一个实例方法。

您可以在 rspec

中使用以下内容
expect_any_instance_of(nimalSanctuary::AnimalInspector::AnimalPicker).to receive(:pick_animals).with("dogs").to_eq("Dog")

希望对您有所帮助