• @chenge 这里专门写了一篇关于如何测试 Gem,希望对你的问题能有所帮助。😄

  • #7 楼 @chenge 你用的是 minitest 吧,如果是 minitest,它不会解决加载路径的问题,所以require 'test_helper'会找不到路径,需要用request_relative '../test_helper'的相对路径方法。如果用的是 rspec,它是会默认先把 spec 文件夹放到加载路径下的。其实有更简单的方法,就是在 Rakefile 中添加一个 test task:

    require 'rake/testtask'
    
    Rake::TestTask.new do |t|
      t.libs << 'test' << 'lib'
      t.pattern = 'test/test_*.rb'
    end
    

    然后执行rake test就可以了。其实还可以更简单,现在你的每个文件还是要require 'test_helper'的,它可以默认就被加载进去,也就每个文件自动require 'test_helper',只需要一句话:

    require 'rake/testtask'
    
    Rake::TestTask.new do |t|
      t.libs << 'test' << 'lib'
      t.pattern = 'test/test_*.rb'
      t.ruby_opts << '-r test_helper' # 指定ruby运行参数,自动require test_helper
    end
    
    # 再指定默认的task为test
    task :default => :test
    

    现在你的每个测试用例文件都不需要 require 什么东西了,只需要在 test_helper 中设置好就 OK 了,执行rake

    $ rake
    
    Run options: --seed 12023
    
    # Running:
    
    .
    
    Finished in 0.000722s, 1385.6922 runs/s, 1385.6922 assertions/s.
    
    1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
    

    现在执行测试是不是简单多了?😄

  • #4 楼 @chenge 好的,下一篇就写一下如何测试一个 gem,敬请关注啊,😄

  • #1 楼 @i5ting 这个就写给入门级的同学看的哈,😄, 主要是想从基础入手阐述 Ruby 中的几个基础概念,后续还会结合加载路径和 bundler 写两篇

  • Ruby DATA at 2015年06月19日

    #3 楼 @msg7086 嗯,其实我们基本上也这么用,虽然没有用 zip 包。我们来做一些系统管理的脚本时,会把模板文件放在后面,有的比较长,脚本本身没多长,倒是模板文件比较长,这时候用 DATA 比较方便,原本两个文件合成一个,并且代码和数据进行了分离,和你的想法是一致的。不过这个 DATA 作为流输入,本身就有很多流的可用方法,相信可用的场景还很多。如果你有过这样的应用场景的话,不妨和我们分享一下。

  • Ruby DATA at 2015年06月18日

    #1 楼 @msg7086 那你认为这种方式的缺点是什么呢?为什么宁愿用 heredoc? 交流一下😄

  • #9 楼 @jay_li Rails 的源码还是很多地方可学的,Sinatra 也是好东西,果然大家现在都开始使用轻量级的框架了,我们的 Ruby 客户有一半多都是 Grape 和 Sinatra

  • Ruby 中的 Profiling 工具 at 2015年06月14日

    #22 楼 @pathbox ruby-prof 可以看看 RubyChina 的这篇:Ruby Profiler 详解之 ruby-prof(I),也是我们写的,Profiler 一般会输出一些格式化的数据,这时候一个好的数据查看工具也是很有帮助的。

  • Ruby 中的 Profiling 工具 at 2015年06月13日

    #20 楼 @pathbox 互相学习啊,😄,快是因为 ruby-prof 是 c 实现的,而时间不一样也跟这个实现有关系,再一个 ruby 的 gc 是个很耗时的操作,ruby 实现的 profiler 也会增加 gc 的压力,代码写的不好的时候这个 gc 的时间可能就会占掉一半,导致计算的时间出现较大的误差,不过一般我们调优的话,不是用两个工具去调,而是用一个,先多跑几次取一个跳动不大的作为基准,针对这个基准再去调,而不是用一个绝对的值去调,所有的 profiler 都会增加程序的绝对执行时间,得出的程序运行时间都是不准确的,越是贴近底层越是接近实际的执行时间。

    看看下面这几个简单的 time 结果:

    没有 Profiler

    real    0m1.462s
    user    0m1.392s
    sys     0m0.068s
    

    内置的 Profiler

    real    0m20.021s
    user    0m19.188s
    sys     0m0.832s
    

    Ruby-Prof

    real    0m2.456s
    user    0m1.891s
    sys     0m0.535s
    

    内置 profiler 耗时主要增加在用户态,主要是还是因为 ruby 实现比较慢和 GC 造成的。下周可能要写一篇 GC 和内存的帖子,正好拿这个作为例子,😄

  • Ruby 中的 Profiling 工具 at 2015年06月12日

    #18 楼 @karen2015 这是什么意思,你这么招人,估计也不会有人和你联系吧,为什么不发个招聘贴呢?

  • #7 楼 @peter 😃 多谢鼓励,争取早日写一本。

  • #5 楼 @jay_li 😄 ,很高兴和你交流,只是我不太清楚,你觉得 Rails strip_heredoc的实现有什么问题吗?

    def strip_heredoc
      indent = scan(/^[ \t]*(?=\S)/).min.try(:size) || 0
      gsub(/^[ \t]{#{indent}}/, '')
    end
    
  • Ruby 中一般使用 Yaml,如@chenge所说,不过 Ruby 读取 Java 的 properties 文件也很容易,如果你有很多现成的 Java Properties 文件读取,可以用https://github.com/jnbt/java-properties,关于 Yaml,读读这篇入门博文Yaml Tutorial

  • #3 楼 @jay_li 你的这种方法是执行 shell 命令,shell 里能做的在这里都能做,只是觉得它没有通用性,而且有时候它是不太方便的。

    如果想要打印下面的输出:

    def m1
      puts "test"
    end
    

    如果用strip_heredoc可以这样:

    print <<-STR.strip_heredoc
      def m1
        puts "test"
      end
    STR
    

    那么用执行 shell 命令的方式就不太方便了吧。还是说有什么更好的方法,希望你能再补充一下,我可以更新到这篇帖子里,谢谢。

  • Ruby 中的 Profiling 工具 at 2015年06月10日

    #16 楼 @gene_wu 开发就无所谓了,基本上都会是你觉得有不太对的地方,才会专门去用它调试一下。😄

  • Ruby 中的 Profiling 工具 at 2015年06月09日

    #12 楼 @gene_wu profiler 是早就有了。如果只是比较效率的话,benchmark 是不是更好的工具呢?

  • Ruby 中的 Profiling 工具 at 2015年06月09日

    #11 楼 @gene_wu rack-mini-profiler线上是不能用的,这个工具设计的初衷就是开发时用的。

  • Ruby 中的 Profiling 工具 at 2015年06月03日

    #3 楼 @flypiggys :thumbsup:

  • 可以试试这个:

    str='\
    <div class="dialog">\
      <div class="title">\
        <img src="close.gif" alt="点击可以关闭" />亲爱的提示条\
      </div>\
      <div class="content">\
        <img src="delete.jpg" alt="" />\
        <span>您真的要GG吗?</span>\
      </div>\
      <div class="bottom">\
        <input id="Button2" type="button" value="确定" class="btn"/>&nbsp;&nbsp;\
        <input id="Button3" type="button" value="取消" class="btn"/>\
      </div>\
    </div>'
    
    console.log(str);