如何最好地测试依赖于另一个文件中的常量的类?

时间:2017-03-06 16:52:53

标签: ruby rspec dependencies

我正在编写一个Ruby库 - 称之为module MyLibrary - 这取决于数据解析器。解析器特定于库,但可能需要在以后更换为不同的解析器,因此将其设置为嵌套在MyLibrary - class MyLibrary::Parser中的类是有意义的。

MyLibrary向客户端公开了一些异常类型,而Parser可能会遇到想要引发这些异常的情况(MyLibrary很乐意通过它们)。所以我有以下安排:

my_library.rb:

require 'parser'
module MyLibrary
  class SomeException < RuntimeError
  end

  def self.do_it
    parser = Parser.new
    parser.parse_it
  end
end

parser.rb

module MyLibrary
 class Parser
   def parse_it
     if bad_stuff
       raise SomeException, "Argh"
     end
   end
 end
end

现在,我想使用rspec对Parser进行单元测试。

parser_spec.rb

require 'parser'

RSpec.describe Parser do
  it 'raises when bad stuff happens' do
    expect { Parser.new.parse_it }.to raise_error(MyLibrary::SomeException)
  end
end

但是因为我正在对Parser进行单元测试,而my_library.rb未被要求,所以SomeException未定义。

SomeException规范中提供Parser的最佳方法是什么?或者我是以完全错误的方式解决这个问题?

2 个答案:

答案 0 :(得分:2)

我认为你可以考虑两件事。

  1. 建立在maxple评论的基础上,除非您有特定原因,SomeException类可以在parser.rb中定义。该类是引发错误的类,规范测试将起作用,并且任何需要该文件的人都可以访问该异常。由于你甚至没有在my_library.rb中引用它,它似乎没问题。支持此方法的另一个行为原因是,如果错误是“解析”错误,则异常名称应反映该错误,Parser是应该拥有该错误的类。如果MyLibrary类只是转发任何异常,那么它是什么并不重要,它不应该在那里定义。

  2. 如果您想保留my_library.rb中定义的异常,那么我建议您使用位于spec_helper.rb文件夹中的spec文件来加载完整的库。这通常需要您的顶级lib/my_library.rb文件来完成。 Rspec通常会将您的顶级lib文件夹添加到ruby include路径中,仅用于此目的。然后,您编写的每个规范测试文件都应require 'spec_helper'。根据我的经验,这可能是在rspec中加载单元测试的所有常见依赖项的最惯用的方式。

答案 1 :(得分:-1)

我在rspec上做得不多,但是如果你将require 'parser'行从my_library.rb移到parser.rb,这对你有帮助吗?我认为它是Parser需要异常而不是相反的方式。

就像我说的那样,我在这种情况下的知识是有限的,但我希望如果在搜索中没有好运,那将有所帮助! :)