ruby Rspec如何测试非示例或类方法?

ktecyv1j  于 2023-04-20  发布在  Ruby
关注(0)|答案(2)|浏览(120)

我有一个简单的脚本,我正在玩(一个Ruby caesars cypher实现),我的方法都不是在Module或Class中编写的。我如何编写Rspec测试来调用这些非示例/类的单独类型方法?

def cypher(string, factor)
  string_array = string.downcase.split('')
  ...
  string_array.each do |item|
    ...
  end
  puts cyphered_array_alpha.join
end

为简洁起见,省略了方法内容。
测试:

describe "#cypher" do
  it "should return characters adjusted by given index" do
    expect(cypher("abcd", 1)).to eql('bcde')
  end
end

我试过使用{cypher()}没有任何乐趣。

hyrbngr7

hyrbngr71#

所有Ruby方法都位于特定的模块或类中
当你在顶层定义方法时,你在Object中将这个方法定义为私有方法。因此它在任何对象中都可用。通常这是一个坏主意。
也许为你的方法(类或模块)使用一些容器并测试这个类或模块会更好
此外,最好定义没有任何输出的方法-只是返回一些值。在这种情况下,您可以在任何地方使用此方法,而不仅仅是在STDOUT中(例如在Web应用程序,电报机器人等)。

# lib/caesar_cypher.rb

module CaesarCypher
  module_function

  def encrypt(string, factor)
  end

  def decrypt(cypher, key)
  end  
end

然后呢

# spec/caesar_cypher_spec.rb

describe CaesarCypher do
  describe '.encrypt' do
    it 'encrypts string...' do
      expect(described_class.encrypt('abcd', 1)).to eq('bcde')
    end
  end

  describe '.decrypt' do
  end
end
jvlzgdj9

jvlzgdj92#

我从this有用的RSpec备忘录中了解到,有一些不太常用的,更“高级”的RSpec匹配器,其中之一;output(...).to_stdout可以用来评估块输出。虽然没有完整解释如何测试非示例或类方法(也可能是单例方法?),但这个匹配器在我的情况下工作:

expect {cypher("abcd", 1)}.to output("zabc\n").to_stdout

相关问题