RSpec:如何在方法内部测试对另一个类方法的调用



所以我在gem中有一些类,我很难测试代码中的特定行。类Foo有两个属性,这两个属性都是类UserClient的实例。如何测试Foo.get_events(date)调用方法Client.get_events(user, date)

class Foo
attr_reader(:user, :client)
def get_events(date)
client.get_events(user[:id], date)
end
end
class Client
def get_events
# Makes API call here
end
end

我已经模拟了对Client.get_events的请求,并且该方法已经成功测试,但我不知道如何测试Foo.get_events调用该方法。

谢谢!

我会这样做:

describe 'Foo#get_event' do
let(:client) { instance_double(Client) }
let(:user) { { id: 'user_id' } } 
let(:date) { Date.today }
subject(:foo) { Foo.new(user, client) } 
before { allow(client).to receive(:get_events).and_return(true) }

it "delegates to the client's method" do
foo.get_event(date)
expect(client)
.to have_recieved(:get_events)
.with('user_id', date)
.once
end
end

由于user[:id]调用,我假设user是一个散列。Foo的实例可能需要以不同的方式初始化以设置userclient,但您没有共享initialize方法的外观。

此外,您会注意到您的测试将立即失败,因为您向client.get_events(user[:id], date)传递了两个参数,但Client中的方法定义不接受任何参数。它可能不得不改变为这样的东西:

class Client
def get_events(user_id, date)
# Makes API call here
end
end

最新更新