Ruby on rails 用于测试的存根Github模块

Ruby on rails 用于测试的存根Github模块,ruby-on-rails,ruby,unit-testing,Ruby On Rails,Ruby,Unit Testing,在我的gem中,我使用gem for GitHub API。我创建了一个EachValidator,用于检查某些URL的存在性,给定: def validate_each(record, attribute, value) return if value.empty? and not opts[:presence] if check_github_url value repo_data = GithubStats::Parser.parse value begin

在我的gem中,我使用gem for GitHub API。我创建了一个
EachValidator
,用于检查某些
URL
的存在性,给定:

def validate_each(record, attribute, value)
  return if value.empty? and not opts[:presence]
  if check_github_url value
    repo_data = GithubStats::Parser.parse value
    begin
      Github.repos(user: repo_data[:username], repo: repo_data[:repo]).commits.all
    rescue Github::Error::NotFound => e
  p e
      record.errors[attribute] << error_message
    end
  else
    record.errors[attribute] << error_message
  end
end
第一件事是在给定参数的条件下返回良好响应或引发异常,所以我需要以某种方式捕获参数。或者我应该提出一个异常的测试用例需要它吗?这将是一个完美而简单的解决方案,但从测试中我什么也得不到,对吗

编辑2: 我试过这样的方法:

#test case class
def initialize param
  Github.stubs(:repos).returns({})
  Github.repos.stubs(:commits).returns({})
  Github.repos.commits.stubs(:all).returns({})
  super param
end

def test_method
  Github.repos.commits.stubs(:all).throws(Github::Error::NotFound.new({}))
  # do the real method
  validated_record = validate_github_url("https://github.com/puradawid/github_stats_notexisting") do |model, attr_name|
    model.errors.[].expects('<<').once
  end
end
#测试用例类
def初始化参数
stubs(:repos).returns({})
Github.repos.stubs(:commits).returns({})
Github.repos.commits.stubs(:all).returns({})
超级参数
结束
def测试方法
Github.repos.commits.stubs(:all).throws(Github::Error::NotFound.new({}))
#做真实的方法
已验证的\u记录=验证\u github\u url(“https://github.com/puradawid/github_stats_notexisting)do |型号,属性名称|
model.errors.[]需要('Try

因此,假设您希望API返回JSON,您可以这样做

require 'json'

...

Github.expects(:repos).returns(JSON.generate({some: :hash}))

这是一个非常好的想法,不幸的是行不通-正如你所看到的,它不是JSON,
Github::API
是更复杂的对象(使用
Hashie
和许多元编程)。我仍然在寻找模仿这个gem的最佳想法。
ArgumentError: uncaught throw #<Github::Error::NotFound:  :  >
    /home/dawid/.rvm/gems/ruby-2.1.5/gems/mocha-1.1.0/lib/mocha/thrower.rb:10:in `throw'
    /home/dawid/.rvm/gems/ruby-2.1.5/gems/mocha-1.1.0/lib/mocha/thrower.rb:10:in `evaluate'
    /home/dawid/.rvm/gems/ruby-2.1.5/gems/mocha-1.1.0/lib/mocha/return_values.rb:20:in `next'
    /home/dawid/.rvm/gems/ruby-2.1.5/gems/mocha-1.1.0/lib/mocha/expectation.rb:569:in `invoke'
    /home/dawid/.rvm/gems/ruby-2.1.5/gems/mocha-1.1.0/lib/mocha/mock.rb:296:in `method_missing'
    /home/dawid/.rvm/gems/ruby-2.1.5/gems/mocha-1.1.0/lib/mocha/class_method.rb:63:in `all'
    /home/dawid/github_stats/lib/validators/github_projects_url_validator.rb:8:in `validate_each'
    /home/dawid/github_stats/test/github_validator_test.rb:85:in `validate_github_url'
    /home/dawid/github_stats/test/github_validator_test.rb:45:in `block in <class:GithubStatsValidatorTest>'
Github.expects(:repos).returns(JSON.generate("Some Return Value"))
require 'json'

...

Github.expects(:repos).returns(JSON.generate({some: :hash}))