em-spec can be used with either bacon, test unit or rspec.
There are two ways to use with the Rspec gem.
To use it as a helper, include EM::SpecHelper in your describe block.
You then use the em method to wrap your evented test code.
Inside the em block, you must call done after your expectations.
Everything works normally otherwise.
require "em-spec/rspec"
describe EventMachine do
include EM::SpecHelper
it "works normally when not using #em" do
1.should == 1
end
it "makes testing evented code easy with #em" do
em do
start = Time.now
EM.add_timer(0.5){
(Time.now-start).should be_close( 0.5, 0.1 )
done
}
end
end
endThe other option is to include EM::Spec in your describe block.
This will patch Rspec so that all of your examples run inside an em block automatically:
require "em-spec/rspec"
describe EventMachine do
include EM::Spec
it "requires a call to #done every time" do
1.should == 1
done
end
it "runs test code in an em block automatically" do
start = Time.now
EM.add_timer(0.5){
(Time.now-start).should be_close( 0.5, 0.1 )
done
}
end
endThe API is identical to Bacon, except that you must explicitly call done
after all the current behavior's assertions have been made:
require 'em-spec/bacon'
EM.describe EventMachine do
should 'have timers' do
start = Time.now
EM.add_timer(0.5){
(Time.now-start).should.be.close 0.5, 0.1
done
}
end
should 'have periodic timers' do
num = 0
start = Time.now
timer = EM.add_periodic_timer(0.5){
if (num += 1) == 2
(Time.now-start).should.be.close 1.0, 0.1
EM.__send__ :cancel_timer, timer
done
end
}
end
endThere are two ways to use the Test::Unit extension.
To use it as a helper, include EM::TestHelper in your test unit class.
You then use the em method to wrap your evented test code.
Inside the em block, you must call done after your expectations.
Everything works normally otherwise.
require 'em-spec/test'
class EmSpecHelperTest < Test::Unit::TestCase
include EventMachine::TestHelper
def test_trivial
em do
assert_equal 1, 1
done
end
end
endThe other option is to include EM::Test in your test class.
This will patch Test::Unit so that all of your examples run inside an
em block automatically:
require 'em-spec/test'
class EmSpecTest < Test::Unit::TestCase
include EventMachine::Test
def test_timer
start = Time.now
EM.add_timer(0.5){
assert_in_delta 0.5, Time.now-start, 0.1
done
}
end
end