首页 > 解决方案 > 如何为实例化其他类对象的方法编写rspec

问题描述

我想在 ruby​​ 中为 A 类的测试方法编写 rspec

class A
  def test
    b = B.new
    b.run!
  end
end

class B
  def run!
    return 1
  end
end

有人可以告诉我如何使用模拟来做到这一点

标签: rubyrspecjrubyrspec-rails

解决方案


你可以这样做:

let(:a) { A.new }
let(:b_mock) { instance_double(B, run!: 'result') }

describe '#test'
  it 'instantiates B and calls #run!' do
    allow(B).to receive(:new).and_return(b_mock)

    a.test

    expect(b_mock).to have_received(:run!)
  end
end

本质上,您想“窥探”创建的实例,并检查它是否已收到您期望的方法。

可以只测试A#test返回1,但是,这样的测试确实在验证 的行为B#run!,这意味着您的测试是耦合的。


推荐阅读