gpt4 book ai didi

ruby - 我如何测试这个特定的方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:00:22 25 4
gpt4 key购买 nike

我有以下方法负责请求 URL 并返回它的 Nokogiri::HTML 文档。此方法检查是否定义了代理,如果定义了,它将调用 OpenURIopen,有或没有代理选项。

实现

require 'open-uri'
require 'nokogiri'

class MyClass
attr_accessor :proxy

# ....

def self.page_content(url)
if MyClass.proxy
proxy_uri = URI.parse(MyClass.proxy)
Nokogiri::HTML(open(url, :proxy => proxy_uri)) # open provided by OpenURI
else
Nokogiri::HTML(open(url)) # open provided by OpenURI
end
end
end

我不知道我应该如何编写证明以下内容的测试:

  1. 定义代理后,OpenURI 发出的请求实际上使用了代理信息
  2. 未定义代理时,会建立常规的非代理连接

这是我作为测试的开始想出的。

describe MyClass, :vcr do

describe '.proxy' do
it { should respond_to(:proxy) }
end

describe '.page_content' do
let(:url) { "https://google.com/" }
let(:page_content) { subject.page_content(url) }

it 'returns a Nokogiri::HTML::Document' do
page_content.should be_a(Nokogiri::HTML::Document)
end

# How do i test this method actually uses a proxy when it's set vs not set?
context 'when using a proxy' do
# ???
xit 'should set open-uri proxy properties' do
end
end

context 'when not using a proxy' do
# ???
xit 'should not set open-uri proxy properties' do
end
end

end

end

最佳答案

首先,您需要安排 proxy 方法在一个测试用例中而不是在另一个测试用例中返回代理。如果代理有一个“setter”方法,您可以使用它,否则您可以 stub proxy 方法。

然后,至少,你想在 open 上设置一个预期,它会在有或没有 :proxy 选项的情况下被调用,这取决于它是哪个测试.除此之外,您可以选择是否对该方法中涉及的各种其他调用进行 stub 和设置期望,包括 URI.parseNokogiri::HTML

参见 https://github.com/rspec/rspec-mocks有关建立测试替身和设定期望的信息。如果您想使用部分 stub 方法,请特别注意 and_call_original 选项。

更新:这里有一些代码可以帮助您入门。这适用于非代理方法。我已经为你留下了代理案件。另请注意,这使用了“部分 stub ”方法,您最终仍会调用外部 gem。

require 'spec_helper'

describe MyClass do

describe '.proxy' do # NOTE: This test succeeds because of attr_accessor, but you're calling a MyClass.proxy (a class method) within your page_content method
it { should respond_to(:proxy) }
end

describe '.page_content' do
let(:url) { "https://google.com/" }
let(:page_content) { MyClass.page_content(url) } # NOTE: Changed to invoke class method

context 'when not using a proxy' do

before {allow(MyClass).to receive(:proxy).and_return(false)} # Stubbed for no-proxy case

it 'returns a Nokogiri::HTML::Document' do
page_content.should be_a(Nokogiri::HTML::Document)
end

it 'should not set open-uri proxy properties' do
expect(MyClass).to receive(:open).with(url).and_call_original # Stubbing open is tricky, see note afterwards
page_content
end
end
# How do i test this method actually uses a proxy when it's set vs not set?
context 'when using a proxy' do
# ???
xit 'should set open-uri proxy properties' do
end
end

end

end

open 的 stub 很棘手。参见 How to rspec mock open-uri?寻求解释。

关于ruby - 我如何测试这个特定的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18168569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com