Tobi
2007-Jan-25 11:36 UTC
[rspec-users] mocking methods that receive blocks - back to mocking Thread again
Hi again, my last example wasn''t good either. It really makes only sense in the context of using Thread. I finally came up with this code, that should now test all important aspects of running a task in a background thread (to keep it simple, I left out the exception handling). see pastie.caboo.se/35559 or end of mail. It seems, TaskRunner is now very well covered by the specs - if you find a way to break TaskRunner without breaking the specs, please let me know. Unfortunately the specifications seem to be a little bit hard to read now. Any suggestions for improvements? bye, Tobias class TaskRunner def initialize @is_running = false end def running? return @is_running end def execute(task) @is_running = true Thread.new(task) do |myTask| myTask.run @is_running = false end end end context "The TaskRunner" do setup do @runner = TaskRunner.new @task = mock(''SampleTask'') @task.stub!(:run) Thread.stub!(:new) end specify "should not run a task in the main thread" do @task.should_not_receive(:run) @runner.execute(@task) end specify "should run a task in a new thread" do Thread.should_receive(:new).with(@task).and_yield(@task) @task.should_receive(:run) @runner.execute(@task) end specify "should be running while a task is beeing executed" do Thread.should_receive(:new).with(@task).and_yield(@task) @task.should_receive(:run) do @runner.should_be_running end @runner.execute(@task) end specify "should not be running after the task has been executed" do Thread.should_receive(:new).with(@task).and_return do |task, block| block.call(task) @runner.should_not_be_running end @runner.execute(@task) end end