开发者

How do you test code that forks using rspec

开发者 https://www.devze.com 2023-03-09 02:22 出处:网络
I have the following开发者_Python百科 code def start_sunspot_server unless @server pid = fork do STDERR.reopen(\"/dev/null\")

I have the following开发者_Python百科 code

  def start_sunspot_server
    unless @server
      pid = fork do
        STDERR.reopen("/dev/null")
        STDOUT.reopen("/dev/null")
        server.run
      end

      at_exit { Process.kill("TERM", pid) }

      wait_until_solr_starts
    end
  end

How would I effectively go about testing it using rspec?

I thought something along

Kernel.should_receive(:fork)
STDERR.should_receive(:reopen).with("/dev/null")
STDOUT.should_receive(:reopen).with("/dev/null")
server.should_receive(:run)

etc


I'm confused by the @server instance variable and server method in your example, but here is an example that should help you get where you're trying to go:

class Runner
  def run
    fork do
      STDERR.reopen("/dev/null")
    end
  end
end

describe "runner" do
  it "#run reopens STDERR at /dev/null" do
    runner = Runner.new

    runner.should_receive(:fork) do |&block|
      STDERR.should_receive(:reopen).with("/dev/null")
      block.call
    end

    runner.run
  end
end

The key is that the fork message is sent to the Runner object itself, even though its implementation is in the Kernel module.

HTH, David


David's solution didn't work for us. Maybe it's because we're not using RSpec 2?

Here's what did work.

def run
  fork do
    blah
  end
end

describe '#run' do
  it 'should create a fork which calls #blah' do
    subject.should_receive(:fork).and_yield do |block_context|
      block_context.should_receive(:blah)
    end

    subject.run_job
  end
end

I'm not sure how this would apply when calling a constant, such as STDERR, but this was the only way we were able to accomplish fork testing.

0

精彩评论

暂无评论...
验证码 换一张
取 消