rspec 测试类方法给出对象未监视或存根错误



Rspec test

我有一个名为客户端的类。

class Client
class << self
def shutdown
puts 'shutting down the producer gracefully'
@producer ||= k_producer.producer(opts)
@producer.shutdown
end
private
def k_producer
Kafka.new([127.0.0.1:9092], { required_acks: :all })
end
end
end

我想测试关闭类方法,但我不明白存根或间谍的概念。

我正在尝试这种方式

RSpec.describe Client do
describe "Client.shutdown" do
it "calls shutdown" do
described_class.shutdown
expect(described_class).to have_received(:shutdown)
end
end
end

我收到此错误,我不知道如何告诉 rspec 我的类中有@producer并调用关闭。

Client (class)> expected to have received shutdown, but that object is not a spy or method has not been stubbed

您从未将described_class设置为间谍。您可以通过将其设为带有allow的部分双精度来做到这一点。

RSpec.describe Client do
describe "Client.shutdown" do
it "calls shutdown" do
allow(described_class).to receive(:shutdown)
described_class.shutdown
expect(described_class).to have_received(:shutdown)
end
end
end

但是,该测试是同义重复的。您只是在测试名为Client.shutdown的测试。测试调用@producer.shutdown更有用。

@producer有点麻烦。我们可以通过为其内部对象添加访问器,使客户端更易于测试,并且通常更灵活。

class Client
class << self
# Define only the writers: producer= and kafka=
attr_writer :producer, :kafka
# Define the readers ourselves with our defaults.
def producer
@producer ||= kafka.producer(opts)
end
def kafka
@kafka ||= Kafka.new(["127.0.0.1:9092"], { required_acks: :all })
end
def shutdown
puts 'shutting down the producer gracefully'
producer.shutdown
end
end
end

现在我们制作一个间谍并将其设置为制作人。

RSpec.describe Client do
describe "Client.shutdown" do
it "calls @producer.shutdown" do
producer = spy("producer")
described_class.producer = producer

described_class.shutdown
expect(producer).to have_received(:shutdown)
end
end
end

最新更新