Tag: 嘲笑

如何使用rspec / rspec-mocks来存根类方法

我正在使用rspec-mock进行测试驱动开发。 我开始实现一个单独的类,并使用rspec-mock来模拟/存根其他类。 模拟尚未实现的类的对象效果很好。 但是,当我尝试模拟一个尚不存在的类的类方法时,我还没有成功。 我的类“Hashes”应该有一个类方法“calculate_hashes”接收文件名并返回一个哈希值。 我试过了 allow(Hashes).to receive(:calculate_hash) do |file| # looks up what to return end 给出错误“哈希不是一个类”。 然后我实施了一个类“哈希” class Hashes end 然后只尝试以相同的方式存根类方法。 这给出了错误“Hashes没有实现:calculate_hash”当我然后将方法添加到我的类定义时: class Hashes def self.calculate_hash(filename) end end 它最终工作,我的这个类方法的存根使用“allow(Hashes)”工作,如上例所示。 我只是想知道是否有一种方法可以在不编写此类骨架的情况下完成此操作。 或者我可能试图以不恰当的方式完成某些事情? 或者rspec-mock可能不是正确的工具呢? 任何帮助是极大的赞赏。

用Minitest惯性模拟OpenURI.open_uri

我有调用OpenURI.open_uri代码,我想确认调用中使用的URI(因此存根不会对我有用),但也会拦截调用。 我希望不必为了测试目的而抽象地调用OpenURI.open_uri 。 我想出的东西似乎冗长而过于复杂。 under_test.rb require ‘open-uri’ class UnderTest def get_request(uri) open(uri).read end end test_under_test.rb require ‘minitest/autorun’ require ‘./lib/under_test’ class TestUnderTest < Mintest::Test def test_get_request @under_test = UnderTest.new mock_json = '{"json":[{"element":"value"}]}' uri = URI('https://www.example.com/api/v1.0?attr=value&format=json') tempfile = Tempfile.new('tempfile') tempfile.write(mock_json) mock_open_uri = Minitest::Mock.new mock_open_uri.expect(:call, tempfile, [uri]) OpenURI.stub :open_uri, mock_open_uri do @under_test.get_request('https://www.example.com/api/v1.0?attr=value&format=json' end mock_open_uri.verify end end 我是否误用或误解了Minitest的嘲笑? 跳舞的部分原因是我也在创建一个Tempfile以便我的read呼叫成功。 […]

RSpec允许/期望vs期望/和_return

在RSpec中,特别是版本> = 3,之间有什么区别: 使用allow来设置返回测试双精度的参数的消息期望,然后使用expect对返回的测试双精度进行断言 只需使用expect来设置参数的期望并返回测试double 或者只是语义学? 我知道提供/指定带有expect的返回值是RSpec模拟2.13中的语法 ,但据我所知,RSpec模拟3中的语法改变为使用allow 。 但是,在下面的(传递)示例代码中,使用allow / expect或者只是expect / and_return似乎会生成相同的结果。 如果一种语法比另一种更受欢迎,也许我会期望有某种弃用通知,但由于没有,似乎两种语法都被认为是有效的: class Foo def self.bar(baz) # not important what happens to baz parameter # only important that it is passed in new end def qux # perform some action end end class SomethingThatCallsFoo def some_long_process(baz) # do some processing Foo.bar(baz).qux # […]