Ruby 未定义的方法ascii\U兼容吗?用于编码:US-ASCII

Ruby 未定义的方法ascii\U兼容吗?用于编码:US-ASCII,ruby,specifications,Ruby,Specifications,我正在尝试运行一个简单的测试\spec,但出现了一个错误。只有在测试失败时才会发生错误 begin require 'rubygems' require 'test/spec' rescue LoadError puts "==> you need test/spec to run tests. {sudo gem install test-spec}" end context "Foo" do specify "should bar" do "ttes".

我正在尝试运行一个简单的
测试\spec
,但出现了一个错误。只有在测试失败时才会发生错误

begin
  require 'rubygems'
  require 'test/spec'
rescue LoadError
  puts "==> you need test/spec to run tests. {sudo gem install test-spec}"
end


context "Foo" do 
  specify "should bar" do 
    "ttes".should.equal "tes"
  end
end
1) 错误:test_spec{Foo}001应为bar:NoMethodError: 未定义的方法
ascii\u兼容?'#
person.rb:11:in
block(2层)in'


我只能猜测,但这里发生了一些非常奇怪的事情。你是在混用Ruby版本还是什么?您使用的是与您的Ruby版本不兼容的gem吗?在Ruby1.9中,每个编码实例都应该响应,所以您可能正在使用1.8(正如您在Windows上所看到的,这似乎是可能的)

此外,完整的堆栈跟踪也会有很大的帮助(您可以使用
begin
/
rescue
捕获异常并调用它。这样,您将发现
测试规范
模块的哪一行出现故障


此外,测试规范似乎不是一个非常积极开发的Gem。也许可以选择使用一个更广泛使用的工具来替代它。我只能猜测,但这里发生了一些非常奇怪的事情。你是在混合Ruby版本还是什么?你是在使用一个与你的Ruby版本不兼容的Gem吗ding实例应该在Ruby 1.9中响应,所以您可能正在使用1.8(正如您在Windows上所看到的,这似乎是可能的)

此外,完整的堆栈跟踪也会有很大的帮助(您可以使用
begin
/
rescue
捕获异常并调用它。这样,您将发现
测试规范
模块的哪一行出现故障


此外,test spec似乎不是一个非常活跃的开发Gem。也许可以选择使用一个更广泛使用的工具来替代它。在Windows上运行Ruby 1.9.1时,我遇到了一个类似的问题。我的环境以前被设置为运行Ruby来编写嵌入式开发自动化测试的脚本


我尝试安装1.9.3,但问题仍然存在。最终卸载了1.9.1和1.9.3,重新安装了Ruby 1.9.3和测试单元gem(2.4.5)现在一切都正常了。

在Windows上运行Ruby 1.9.1时,我遇到了类似的问题。我的环境以前被设置为运行Ruby来编写一些用于嵌入式开发的自动化测试脚本


我尝试安装1.9.3,但问题仍然存在。最终卸载了1.9.1和1.9.3,重新安装了Ruby 1.9.3和测试单元gem(2.4.5),现在一切正常。

我的Ruby 1.9.1版本有一个依赖于“测试单元”的gem。至少有一个 他们中的一个强迫安装了test-unit-2.4.7。对我来说,删除了“test-unit-2.4.7” gem解决了这个问题

在test-unit-2.4.7中,我们有以下代码:

in /home/davei/.gem/ruby/1.9.1/gems/test-unit-2.4.7/lib/test/unit/assertions.rb
   1483  
   1484            def ensure_diffable_string(string)
   1485              if string.respond_to?(:encoding) and
=> 1486                  !string.encoding.ascii_compatible?
   1487                string = string.dup.force_encoding("ASCII-8BIT")
   1488              end
   1489              string
   1490            end
也许每个编码实例都应该支持“ascii_兼容”方法,但是 Ruby 1.9.1p378中的情况并非如此。请亲自查看:

(rdb:1) p string.encoding
#<Encoding:US-ASCII>
(rdb:1) p string.encoding.public_methods
[:to_s, :inspect, :name, :names, :dummy?, :_dump, :dbg, :pretty_print, :pretty_print_cycle, :pretty_print_instance_variables, :pretty_print_inspect, :nil?, :===, :=~, :!~, :eql?, :class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :hash, :__id__, :object_id, :to_enum, :enum_for, :gem, :pretty_inspect, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
(rdb:1)p string.encoding
#
(rdb:1)p string.encoding.public_方法
[:to_s,:inspect,:name,:names,:dump,:dbg,:pretty_print,:pretty_print\u cycle,:pretty_print\u实例变量,:pretty_print\u inspect,:nil?,:===,:==,:!,:eql?,:class,:clone,:dup,:taint,:untaint?,:untaint,:untaint,:untaint,:untaint,:untaint,:untrusted?,:trusted?,:trust,:trust,:trust,:trust,:trust,:trust,:freeze,:freeze,:freeze,:fre公共方法:实例变量:实例变量:实例变量:获取:实例变量:集:实例变量:定义的?,:实例的?,:种类的?,:是?,:点击,:发送,:公共发送,:响应,:扩展,:显示,:方法,:公共方法,:定义单例方法,:散列,::对象的id,:对象的id,:到!,:枚举为,:gem,:pretty,,:检查,:,:!,:!=,:实例评估,:实例执行,:\u发送]

我发现编码也缺少“ascii\U兼容”:UTF-8。

我的Ruby 1.9.1版本有一个依赖于“测试单元”的gems。至少有一个 他们中的一个强迫安装了test-unit-2.4.7。对我来说,删除了“test-unit-2.4.7” gem解决了这个问题

在test-unit-2.4.7中,我们有以下代码:

in /home/davei/.gem/ruby/1.9.1/gems/test-unit-2.4.7/lib/test/unit/assertions.rb
   1483  
   1484            def ensure_diffable_string(string)
   1485              if string.respond_to?(:encoding) and
=> 1486                  !string.encoding.ascii_compatible?
   1487                string = string.dup.force_encoding("ASCII-8BIT")
   1488              end
   1489              string
   1490            end
也许每个编码实例都应该支持“ascii_兼容”方法,但是 Ruby 1.9.1p378中的情况并非如此。请亲自查看:

(rdb:1) p string.encoding
#<Encoding:US-ASCII>
(rdb:1) p string.encoding.public_methods
[:to_s, :inspect, :name, :names, :dummy?, :_dump, :dbg, :pretty_print, :pretty_print_cycle, :pretty_print_instance_variables, :pretty_print_inspect, :nil?, :===, :=~, :!~, :eql?, :class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :hash, :__id__, :object_id, :to_enum, :enum_for, :gem, :pretty_inspect, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
(rdb:1)p string.encoding
#
(rdb:1)p string.encoding.public_方法
[:to_s,:inspect,:name,:names,:dump,:dbg,:pretty_print,:pretty_print\u cycle,:pretty_print\u实例变量,:pretty_print\u inspect,:nil?,:===,:==,:!,:eql?,:class,:clone,:dup,:taint,:untaint?,:untaint,:untaint,:untaint,:untaint,:untaint,:untrusted?,:trusted?,:trust,:trust,:trust,:trust,:trust,:trust,:freeze,:freeze,:freeze,:fre公共方法:实例变量:实例变量:实例变量:获取:实例变量:集:实例变量:定义的?,:实例的?,:种类的?,:是?,:点击,:发送,:公共发送,:响应,:扩展,:显示,:方法,:公共方法,:定义单例方法,:散列,::对象的id,:对象的id,:到!,:枚举为,:gem,:pretty,,:检查,:,:!,:!=,:实例评估,:实例执行,:\u发送]

我发现编码也缺少了“ascii_兼容”:UTF-8。

person.rb看起来像什么?具体是第8-14行左右。我帖子中错误消息上方的代码是
person.rb
person.rb看起来像什么?具体是第8-14行左右。我帖子中错误消息上方的代码是
person。rb