Ruby 具有不同DNS服务器的rspec

Ruby 具有不同DNS服务器的rspec,ruby,testing,rspec,infrastructure,Ruby,Testing,Rspec,Infrastructure,我有一系列使用外部数据库的rspec测试(我知道,这不是一个好主意,但有很多原因表明这是这种情况下的最佳解决方案)。我已经使用测试环境设置了不同的vlan,以便在隔离环境中运行测试。现在我想定义所有rspec测试都使用不同的DNS服务器来解析主机名(与dev环境一起工作)。有什么我可以用的吗?RubyDNS可能适合你。此示例几乎是他们GH页面上的逐字记录: #!/usr/bin/env ruby require 'rubydns' INTERFACES = [ [:udp, "0.0.0.

我有一系列使用外部数据库的rspec测试(我知道,这不是一个好主意,但有很多原因表明这是这种情况下的最佳解决方案)。我已经使用测试环境设置了不同的vlan,以便在隔离环境中运行测试。现在我想定义所有rspec测试都使用不同的DNS服务器来解析主机名(与dev环境一起工作)。有什么我可以用的吗?

RubyDNS可能适合你。此示例几乎是他们GH页面上的逐字记录:

#!/usr/bin/env ruby
require 'rubydns'

INTERFACES = [
  [:udp, "0.0.0.0", 5300],
  [:tcp, "0.0.0.0", 5300]
]
Name = Resolv::DNS::Name
IN = Resolv::DNS::Resource::IN

# Use upstream DNS for name resolution.
UPSTREAM = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])

# start the RubyDNS server
RubyDNS::run_server(:listen => INTERFACES) do
    match(/database\.testing\.com/, IN::A) do |transaction|
        transaction.respond!("10.0.0.80")
    end

    # Default DNS handler
    otherwise do |transaction|
        transaction.passthrough!(UPSTREAM)
    end
end
然后查询:

➜  ruby_dns_example  dig @localhost -p 5300 database.testing.com

; <<>> DiG 9.8.3-P1 <<>> @localhost -p 5300 database.testing.com
; (3 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34286
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;database.testing.com.      IN  A

;; ANSWER SECTION:
database.testing.com.   86400   IN  A   10.0.0.80

;; Query time: 2 msec
;; SERVER: 127.0.0.1#5300(127.0.0.1)
;; WHEN: Sat Jan 31 13:14:14 2015
;; MSG SIZE  rcvd: 54
➜  ruby_dns_示例dig@localhost-p5300 database.testing.com
;  DiG 9.8.3-P1@localhost-p5300 database.testing.com
; (找到3台服务器)
;; 全局选项:+cmd
;; 得到答案:

;; ->>HEADER您可以改用DnsMock。它是一个测试框架无关的轻量级UDP DNS模拟服务器,具有动态/手动端口分配:

需要“dns\u mock”
记录={
'example.com'=>{
a:%w[1.1.1.12.2.2.2],
aaaa:%w[2a00:1450:4001:81e::200e],
ns:%w[ns1.domain.com ns2.domain.com],
mx:%w[mx1.domain.com mx2.domain.com],
txt:%w[txt\u记录\u 1 txt\u记录\u 2],
cname:'some.domain.com',
soa:[
{
mname:'dns1.domain.com',
rname:'dns2.domain.com',
序列号:2_035_971_683,
刷新:10000,
重试:2_400,
到期日:604_800,
最低:3_600
}
]
},
'1.1.1.1' => {
ptr:%w[域1.com域2.com]
}
}
DnsMock.start_服务器(记录:记录,端口:5300)

DNS解析器设置通常是在操作系统级别配置的,所以我认为您无能为力。我知道这是没有帮助的,但最好的,也可能是唯一的方法是修复您的规格,这样他们就不会调用任何外部系统。用模仿之类的。VCR()等工具可以帮助您进行外部呼叫。不确定这是否有帮助,但如果您使用IPs,您可以使用以下工具