使用标准Ruby Test::Unit框架对Ruby中的受保护和私有方法进行单元测试的最佳方法是什么?
我敢肯定有人会说道,"你应该只测试公共方法;如果它需要单元测试,它不应该是一个受保护的或私有的方法",但我真的不想讨论这个问题.我有几个方法被保护的或私有的良好和有效的原因,这些私人/受保护的方法是相对复杂的,并且在类的公共方法依赖于这些保护/私有方法正常工作,所以我需要一种方法来测试受保护/私有方法.
还有一件事......我通常将给定类的所有方法放在一个文件中,然后单元在另一个文件中测试该类.理想情况下,我希望将所有"受保护和私有方法的单元测试"功能实现到单元测试文件而不是主要源文件中,以保持主源文件尽可能简单明了.
我正在试图找出如何解决eval()在Ruby 1.8.6中使用代码时出现的语法错误.
我希望以下Ruby代码:
#!/usr/bin/ruby
good_str = "(1+1)"
bad_str = "(1+1" # syntax error: missing closing paren
begin
puts eval(good_str)
puts eval(bad_str)
rescue => exc
puts "RESCUED!"
end
Run Code Online (Sandbox Code Playgroud)
运行时产生以下结果:
2
RESCUED!
Run Code Online (Sandbox Code Playgroud)
相反,我得到的是:
2
eval_rescue.rb:8: (eval):1: compile error (SyntaxError)
(eval):1: syntax error, unexpected $end, expecting ')'
Run Code Online (Sandbox Code Playgroud)
似乎eval方法引发的SyntaxError正在eval中的某个地方被拯救,而我没有机会自己处理它.
任何人都知道如何获得我想要的行为(即,我的'rescue'条款从'eval'中捕获错误)?
eruby和erb有什么区别?什么考虑会促使我选择其中一个?
我的应用程序是为网络设备(路由器,负载平衡器,防火墙等)生成配置文件.我的计划是模拟配置文件,使用源文件中的嵌入式ruby(通过eruby或erb)来执行迭代生成路由器的所有接口配置块(这些块都非常相似,仅在标签中有所不同)和一个IP地址).例如,我可能有这样的配置模板文件:
hostname sample-router
<%=
r = String.new;
[
["GigabitEthernet1/1", "10.5.16.1"],
["GigabitEthernet1/2", "10.5.17.1"],
["GigabitEthernet1/3", "10.5.18.1"]
].each { |tuple|
r << "interface #{tuple[0]}\n"
r << " ip address #{tuple[1]} netmask 255.255.255.0\n"
}
r.chomp
%>
logging 10.5.16.26
Run Code Online (Sandbox Code Playgroud)
当通过嵌入式ruby解释器(erb或eruby)运行时,会产生以下输出:
hostname sample-router
interface GigabitEthernet1/1
ip address 10.5.16.1 netmask 255.255.255.0
interface GigabitEthernet1/2
ip address 10.5.17.1 netmask 255.255.255.0
interface GigabitEthernet1/3
ip address 10.5.18.1 netmask 255.255.255.0
logging 10.5.16.26
Run Code Online (Sandbox Code Playgroud)