如何为自制公式编写测试?

时间:2018-05-30 15:48:53

标签: testing homebrew

我制作了一个自制的配方,现在只能在我当地的水龙头上使用。我想将pull请求发送到homebrew-core。现在我需要为我的公式编写测试。如何根据以下示例编写?

test do
  output = shell_output("#{bin}/balance 2>&1", 64)
  assert_match "this is balance #{version}", output
end

我的公式

#!/usr/bin/env ruby

def match
  files = Dir.glob("*")

  if ARGV.length == 0 
  puts "usage: match <keyword>"
  return
 end

files.each { |x| 
if File.directory?(x) 
    puts "#{x}_ found directory"
    puts "***"
next
end

found = false

File.open(x).each_line.with_index do |line, index|
    if line.include? ARGV[0]
       puts "#{x}_ #{index+1}  #{line}" 
       found = true
    end
end

puts "***" if found  
}
end

match

Brew公式

class Match < Formula
desc "Browse all files inside any directory for a keyword"
homepage "https://github.com/aatalyk/homebrew-match"
url ""
sha256 ""

def install
   bin.install "match"     
end
end

1 个答案:

答案 0 :(得分:3)

在Homebrew公式中测试shell命令通常遵循以下方案:

  1. 创建命令可用的上下文:git存储库,目录层次结构,示例文件等。
  2. 运行命令
  3. 断言结果是正确的
  4. 在您的情况下,由于match类似于grep -R,您可以使用某些内容创建一堆文件,然后运行match <something>并确保找到正确的文件。

    您可以在测试中使用任何Ruby代码以及shell_output("...command...")等Homebrew实用程序来获取命令的输出。

    以下是您可以编写的测试示例:

    class Match < Formula
      # ...
    
      test do
        # Create two dummy files
        (testpath/"file1").write "foo\nbar\nqux"
        (testpath/"file2").write "bar\nabc"
    
        # Ensure `match bar` finds both files
        assert_match "file1_ 2  bar\n***\nfile2_ 1  bar",
          shell_output("#{bin}/match bar")
    
        # Ensure `match abc` finds the second file
        assert_match "file2_ 2  abc", shell_output("#{bin}/match abc")
    
        # Ensure `match idontmatchanything` doesn’t match any of the files
        assert_not_match(/file[12]/,
          shell_output("#{bin}/match idontmatchanything"))
      end
    end
    

    assert_match "something", shell_output("command")确保(1)command成功运行,(2)其输出包含&#34; something&#34;。