0

快速 rspec 问题在这里。

鉴于以下测试...

it 'sets the correct params' do
  property = 'blahblah'
  expect(ConnectionClass).to receive(:new).with({ opt1: param1, opt2: property })
  subject.send(:do_things, nil, nil).and_return_nil
end

和以下方法...

private
def do_things(param1, param2)
  connection = ConnectionClass.new(opt1: param1, opt2: param2)
  ##
  # How do i stop the test from continue beyond this point? :(
  ##
  some_var = connection.build_request do |blah|
    # ...
  end

  some_var.some_attribute 
end

运行测试导致以下失败:

Failures:

  1) Klass#do_things sets the correct params
     Failure/Error: subject.send(:do_things, nil, nil).and_return_nil
     NoMethodError:
       undefined method `build_request' for nil:NilClass
     # ./lib/blah/Klass.rb:46:in `make_request'
     # ./spec/lib/blah/Klass_spec.rb:79:in `block (3 levels) in <top (required)>'

对于这个测试,我关心的是它ConnectionClass是否正确初始化——我怎样才能防止调用build_request和最终some_attribute

谢谢

4

1 回答 1

4

这通常是一个很好的信号,表明您要么需要重构代码,要么正在测试不需要测试的东西。而不是测试实现(“这个类是用这些参数实例化的”)考虑测试你的输出(对于输入X,do_things应该返回输出Y并有副作用Z)。如果您认为“我希望此测试在此方法的中间停止”,您需要重构您正在测试的方法,以便您可以离散地测试您想要测试的位。

也就是说,如果您不想在这里更改您的方法,您可以从您的存根中返回一个 double,以便它可以完成该方法。

some_var   = double(some_attribute: "value")
connection = double(build_request: some_var)
expect(ConnectionClass).to receive(:new).with({ opt1: param1, opt2: property }).
  and_return(connection)
于 2013-08-22T02:04:19.763 回答