我有真實世界的代碼,它執行以下操作:
attr_reader :response
def initialize(response)
@response = response
end
def success?
response.is_a?(Net::HTTPOK)
end
和一個測驗:
subject { described_class.new(response) }
let(:response) { instance_double(Net::HTTPOK, :body => 'nice body!', :code => 200) }
it 'should be successful' do
expect(subject).to be_success
end
這失敗了,因為#<InstanceDouble(Net::HTTPOK) (anonymous)>不是Net::HTTPOK
...我能夠弄清楚如何解決這個問題的唯一方法是進行黑客攻擊:
let(:response) do
instance_double(Net::HTTPOK, :body => 'nice body!', :code => 200).tap do |dbl|
class << dbl
def is_a?(arg)
instance_variable_get('@doubled_module').send(:object) == arg
end
end
end
end
我無法想象我是歷史 ruby?? 和 rspec 中唯一一個正在測驗對測驗替身執行自省的代碼的人,因此認為必須有更好的方法來做到這一點——必須有一種可以is_a?用雙打來解決問題的方法?
uj5u.com熱心網友回復:
我會做:
let(:response) { instance_double(Net::HTTPOK, :body => 'nice body!', :code => 200) }
before { allow(response).to receive(:is_a?).with(Net::HTTPOK).and_return(true) }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/436762.html
