我有这堂课:
require 'yaml'
class Configuration
class ParseError < StandardError; end
attr_reader :config
def initialize(path)
@config = YAML.load_file(path)
rescue => e
raise ParseError, "Cannot open config file because of #{e.message}"
end
def method_missing(key, *args, &block)
config_defines_method?(key) ? @config[key.to_s] : super
end
def respond_to_missing?(method_name, include_private = false)
config_defines_method?(method_name) || super
end
private
def config_defines_method?(key)
@config.has_key?(key.to_s)
end
end
如何编写方法测试:method_missing,respond_to_missing?,config_defines_method? 我对单元测试有一些了解,但是当涉及到Ruby时我很新。
到目前为止,我已经尝试过这个:
def setup
@t_configuration = Configuration.new('./config.yaml')
end
def test_config_defines_method
@t_configuration.config[:test_item] = "test"
assert @t_configuration.respond_to_missing?(:test_item)
end
我不确定我是否正确测试,因为当我进行rake测试时,它给了我这个:
NoMethodError:私有方法`respond_to_missing?&#39;呼吁#
如果没有明确的方法如何解决这个问题,是否有人可以将我带到一个类似测试的地方?到目前为止,我只发现了hello world类型的测试示例,在这种情况下没有多大帮助。
答案 0 :(得分:2)
如documentation for #respond_to_missing?
中所述,您不希望直接调用该方法。相反,您要检查对象是否响应您的方法。这是使用#respond_to?
方法完成的:
assert @t_configuration.respond_to?(:test_item)