You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Provides useful RSpec.shared_contexts for testing code that builds on top of async.
Installation
$ bundle add async-rspec
Then add this require statement to the top of spec/spec_helper.rb
require'async/rspec'
Usage
Async Reactor
Many specs need to run within a reactor. A shared context is provided which includes all the relevant bits, including the above leaks checks. If your spec fails to run in less than 10 seconds, an Async::TimeoutError raises to prevent your test suite from hanging.
require'async/io'RSpec.describeAsync::IOdoinclude_contextAsync::RSpec::Reactorlet(:pipe){IO.pipe}let(:input){Async::IO::Generic.new(pipe.first)}let(:output){Async::IO::Generic.new(pipe.last)}it"should send and receive data within the same reactor"domessage=niloutput_task=reactor.asyncdomessage=input.read(1024)endreactor.asyncdooutput.write("Hello World")endoutput_task.waitexpect(message).tobe == "Hello World"input.closeoutput.closeendend
Changing Timeout
You can change the timeout by specifying it as an option:
RSpec.describeMySlowThing,timeout: 60do# ...end
File Descriptor Leaks
Leaking sockets and other kinds of IOs are a problem for long running services. Async::RSpec::Leaks tracks all open sockets both before and after the spec. If any are left open, a RuntimeError is raised and the spec fails.
RSpec.describe"leaky ios"doinclude_contextAsync::RSpec::Leaks# The following fails:it"leaks io"do@input,@output=IO.pipeendend
In some cases, the Ruby garbage collector will close IOs. In the above case, it's possible that just writing IO.pipe will not leak as Ruby will garbage collect the resulting IOs immediately. It's still incorrect to not close IOs, so don't depend on this behaviour.