Ers*_*yan 5 ruby tdd rspec rspec2
我有以下代码
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
Run Code Online (Sandbox Code Playgroud)
我如何有效地使用rspec进行测试?
我在想什么
Kernel.should_receive(:fork)
STDERR.should_receive(:reopen).with("/dev/null")
STDOUT.should_receive(:reopen).with("/dev/null")
server.should_receive(:run)
Run Code Online (Sandbox Code Playgroud)
等等
Dav*_*sky 11
我对你的例子中的@server实例变量和server方法感到困惑,但是这里有一个例子可以帮助你到达你想去的地方:
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
Run Code Online (Sandbox Code Playgroud)
关键是fork消息被发送到Runner对象本身,即使它的实现在Kernel模块中.
HTH,大卫