从rake运行时测试失败,直接运行时测试失败

时间:2015-01-21 23:06:07

标签: ruby rake

运行Ruby 1.9.3,当我直接使用./test_mail.rb运行我的测试时,它会通过。当我通过' rake test'运行它时,它会失败

  1) Failure:
test_initialization(TC_Test_mail) [/Users/lcuff/Software_Realm/eco/etl  
/etl/etl_2.0/src/ruby/mail_processing/ruby_eco_classes/rake_example   
/test_mail.rb:13]:
Expected: "Hi Mom"
Actual: "No subject specified"

我的课程:

#!/usr/bin/env ruby

class MyMail

  attr_reader :subject

  def initialize( mail)

    subject = mail.to_s[/Subject:.*\r?/]
    if subject.nil?
      subject = "No subject specified"
    else
      subject = subject.strip.gsub!(/Subject:\s/, '')
    end
    @subject = subject
  end
end

我的测试代码:

#!/usr/bin/env ruby

gem 'minitest'
require 'minitest/autorun'
require_relative 'MyMail'

class  TC_Test_mail < MiniTest::Unit::TestCase

  def test_initialization
    mock_mail = MiniTest::Mock.new
    mock_mail.expect(:to_s, "Subject: Hi Mom\nDate 2014-04-01\n", [])
    the_mail = MyMail.new(mock_mail)
    assert_equal('Hi Mom', the_mail.subject )
    mock_mail.verify
  end
end

和rakefile

require 'rake/testtask'

Rake::TestTask.new do |t|
  t.pattern = "test_*.rb"
end

1 个答案:

答案 0 :(得分:0)

这里唯一突出的是你使用'\n'来分隔单个字符串中的不同参数。

您的正则表达式符合:/Subject:.*\r?/

但是你传递的是字符串:"Subject: Hi Mom\n ...

我并不特别了解Rake,但根据我的经验,这些测试在批处理环境中执行的方式与直接调用时的环境条件略有不同。

当你从命令行调用时,ruby正则表达式引擎知道'\r'匹配'\n',但是在纯粹的批处理环境中,它并不能帮到你。

如果您将正则表达式更改为/Subject:.*[\r]?[\n]?/,您应该看到正确的跨平台操作。

事实上/Subject:[^\r\n]*?/可能更整洁。

$ irb
irb(main):001:0> mail = "Subject: Hi Mom\nDate 2014-04-01\n"
=> "Subject: Hi Mom\nDate 2014-04-01\n"
irb(main):004:0> subject = mail.to_s[/Subject:[^\r]*/]
=> "Subject: Hi Mom\nDate 2014-04-01\n"
irb(main):005:0> subject = mail.to_s[/Subject:[^\r\n]*/]
=> "Subject: Hi Mom"