使用rspec测试命令行输出

时间:2014-09-16 19:09:43

标签: ruby rspec

我正在尝试使用'youtube-dl'测试从youtube下载的小宝石。

我想测试命令youtube-dl [url] --get-title的输出,但我不知道我是怎么做的。

这是我的代码:

module Youruby
  class Youtube
    YT_DL = File.join(File.expand_path(File.dirname(__FILE__)), "../bin/youtube-dl")
    def initialize(id)
      @id = id
    end

    def get_title
      system(YT_DL, '--get-title', get_url)
    end
 end
end

这是我的考验:

require "spec_helper"
require "youruby"

describe Youruby do

  it "get video title" do
    video = Youruby::Youtube.new('uaEJvYWc2ag')
    video.get_title.should == "FFmpeg-slowmotion.1"
  end
end

当我运行测试时,我收到此错误:

Failure/Error: video.get_title.should == "FFmpeg-slowmotion.1"
   expected: "FFmpeg-slowmotion.1"
        got: true (using ==)
   Diff:
   @@ -1,2 +1,2 @@
   -"FFmpeg-slowmotion.1"
   +true

我该怎么做?

1 个答案:

答案 0 :(得分:2)

好像你的测试没问题,而且实现失败了(所以,测试报告失败是可以的)

在实现上,不使用 system 方法(根据命令的返回代码返回true / false),而是使用backtick(使用命令的输出返回字符串)

def get_title 
  `#{YT_DL} --get-file #{get_url}`
end

另外,作为附加说明,依赖于外部命令(从单元测试的角度来看)不利于您的实现,也许您想要模拟外部系统命令执行(或者不是,您可能知道什么策略更适合于你的具体情况)