-2

这一行:

@page = @page.launch_profile(@profile_name)

导致此错误:

undefined method `launch_profile' for #<Object:0x007f9013d785e8> (NoMethodError)

如果我puts "Page = #{@page} "{@page.class}"在抱怨的电话之前立即添加,我会得到

Page = #<OwnProfilePage:0x007f9013bf5e78> OwnProfilePage

奇怪的是,在命令行上,相同版本的 Ruby (2.1.5) 会这样做:

$ ruby -le 'class Dog; end; Dog.new.foo'
-e:1:in `<main>': undefined method `foo' for #<Dog:0x007fb64120c6d8> (NoMethodError)

所以我知道它通常有效。

我尝试向 中添加一个method_missing()方法Object,但它没有任何影响,所以我认为其他人在其他地方正在修补猴子或覆盖或以其他方式破坏元数据。我什至修补NoMethodError.new()了打印堆栈跟踪以尝试定位错误代码。

此外,当在遥远的随机宝石中可能存在如此多的伏都教和其他考虑不周的全球变化废话时,是否有一个合理的通用方法来确定 Ruby 系统的哪一部分正在做什么?(在另一种情况下,'fail' 开始报告上一个获救异常的消息,而不是我提供的字符串。)

4

1 回答 1

0

好的,我发现了发生了什么:

这是 calabash-android 的ABase类,它的method_missing“有用”委托给它的world对象,它也不知道我的方法(不足为奇)。不幸的是,当他/她令人惊讶的实现细节失败时,它的作者没有考虑捕获异常,所以它报告的不是我的页面对象而是世界对象,并使 Ruby 看起来很糟糕。

如果我仔细查看我的日志记录的 hexagibberish,我会注意到它不是 Ruby 错误报告了我的页面对象的类,而是正确报告了一个完全不同的对象(尽管对象的类不是Object,但Object+Test::Unit::Assertions+half+a+million+other+mixins它会更快地提示我它报告了错误的事情)。

我已经将method_missing 的主体包装在一个try/catch报告真实对象的文件中,并且还提到其中也没有world任何信息。

这是我不喜欢魔法的主要原因之一:人们通常无法提供适当的诊断。另一个主要原因是因为用于透明地实现令人惊讶的行为的魔法是邪恶的。

于 2015-10-16T10:49:40.777 回答