所以我在gem中有一些类,我很难测试代码中的特定行。类Foo
有两个属性,这两个属性都是类User
和Client
的实例。如何测试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
的实例可能需要以不同的方式初始化以设置user
和client
,但您没有共享initialize
方法的外观。
此外,您会注意到您的测试将立即失败,因为您向client.get_events(user[:id], date)
传递了两个参数,但Client
中的方法定义不接受任何参数。它可能不得不改变为这样的东西:
class Client
def get_events(user_id, date)
# Makes API call here
end
end