gpt4 book ai didi

ruby - 如何通过 RSpec 模拟使用 sorbet 类型检查?

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:43 30 4
gpt4 key购买 nike

我有一个具有冰糕类型签名定义的方法。在使用 RSpec 的测试中尝试模拟此方法时,出现类型不匹配错误。我正在尝试了解如何解决此问题并添加基于 RSpec 的测试而不影响冰糕类型检查。

sig {params(login_context: LoginContext, company_id: String).returns(T::Boolean)}
def populate_dummy_data(login_context, company_id)

测试代码:

@login_context = double(LoginContext, :requester => @requester) # Creates an instance of type Rspec::Mocks::double

错误:

expected no Exception, got #<TypeError: Parameter ‘login_context’: Expected type LoginContext, got type RSpec::Mocks::Double wit...a_populator_spec.rb:42

最佳答案

默认情况下,Mocha 模拟(测试中的 stub )不会通过任何类型检查。这是故意的,被认为是一个功能;裸模拟使测试变得脆弱,并且在重构代码时往往会导致问题,无论类型检查如何。

当尝试使用未通过类型检查的 Mocha mock 测试方法时,我们建议重写测试以不使用 Mocha mock。要么:

  • 创建对象的真实实例,并使用 .stubs 仅替换某些方法。
  • 编写辅助函数以使用虚假数据创建对象的真实实例。

在最坏的情况下,您可以 stub is_a? 以使 Mocha 模拟通过类型检查,但请避免这样做。它会导致脆弱的测试并使代码更难推理。如果必须:

# NOT RECOMMENDED!

fake_llama = stub
fake_llama.stubs(:llama_count).returns(17)
fake_llama.stubs(:is_a?).with(M::Llama).returns(true)

我不熟悉 RSpec 的 mock 和 Mocha 的 mock 之间的区别(在开发 Sorbet 的 Stripe 中我们使用 Mocha),但原理应该是相同的。

关于ruby - 如何通过 RSpec 模拟使用 sorbet 类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56742572/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com