首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在RSpec模拟中使用冰激凌类型检查?

如何在RSpec模拟中使用冰激凌类型检查?
EN

Stack Overflow用户
提问于 2019-06-25 03:09:08
回答 1查看 1.4K关注 0票数 9

我有一个方法,它有一个sorbet类型的签名定义。当尝试在使用RSpec的测试中模拟此方法时,我得到了一个类型不匹配错误。我正在尝试理解如何解决这个问题,并且可以在不影响冰沙类型检查的情况下添加基于RSpec的测试。

代码语言:javascript
复制
sig {params(login_context: LoginContext, company_id: String).returns(T::Boolean)}
  def populate_dummy_data(login_context, company_id)

测试代码:

代码语言:javascript
复制
@login_context = double(LoginContext, :requester => @requester) # Creates an instance of type Rspec::Mocks::double

错误:

代码语言:javascript
复制
expected no Exception, got #<TypeError: Parameter ‘login_context’: Expected type LoginContext, got type RSpec::Mocks::Double wit...a_populator_spec.rb:42
EN

回答 1

Stack Overflow用户

发布于 2019-07-05 22:46:59

解决方案1:

使用带有适当类的instance_double,并模拟它的is_a?。要在全局范围内完成此操作,请执行monkey patching:

代码语言:javascript
复制
require 'rspec/mocks'

class RSpec::Mocks::InstanceVerifyingDouble
  def is_a?(expected)
    @doubled_module.target <= expected || super
  end
end

解决方案2:

有选择地,当mock导致时,不要引发异常。这样,除非使用mock,否则Sorbet仍然会执行类型检查。

代码语言:javascript
复制
require 'sorbet-runtime'

RSpec.configure do |config|
  config.before :each, sorbet: :mocks do
    T::Configuration.inline_type_error_handler = proc do |error|
      raise error unless error.message.include? "got type RSpec::Mocks"
    end

    T::Configuration.call_validation_error_handler = proc do |_signature, opts|
      raise TypeError.new(opts[:pretty_message]) unless opts[:message].include? "got type RSpec::Mocks"
    end
  end


  config.after :each, sorbet: :mocks do
    T::Configuration.inline_type_error_handler = nil
    T::Configuration.call_validation_error_handler = nil
  end
end
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56742572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档