运行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
答案 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"