[mocha-developer] Testing event driven Socket classes

hemant gethemant at gmail.com
Fri Dec 15 18:17:15 EST 2006


Ok, here is the class, I want to Unit Test, its part of a large app
and is based on EventMachine library.

I want to mock the class TickServer ( i.e not stub it) . Since in
actual scenario, you can't do this on this class:

@server = TickServer.new # will toss an exception at your face

you must initialize the server like this:

EventMachine.run {
  EventMachine.start_server("192.168.2.252",6200,TickServer) do |conn|
    conn.hello_world
  end
}

Where conn holds the instance of the class TickServer. So, I want to
mock this class, so that i don't have to create an actual socket
connection.

Please look in the code, carefully. most of the methods in class are
actually callbacks, which respond to certain events.

Is it possible to unit test this with Mocha?



require "eventmachine"

class TickServer < EventMachine::Connection
  attr_accessor :chunked_data,:client_status

  def valid_protocol? data
    return false unless data =~ /(\d{3})([^<>]*)<([^><]*)>##(.*?)##/
    return true
  end

  # method is a callback, gets called whenever data is there in socket to read
  def receive_data data
    data.chomp!
    while data && data.length > 0
      data_array = data.split(/\r?\n/m,2)
      @chunked_data << data_array[0]
      data = data_array[1]
      # two level of protocol handling
      if @chunked_data =~ /(\d{3})(.*)<(.*)?>(##(.*)##)/
          if valid_protocol?(@chunked_data)
            dispatch_request
          else
            send_error_without_callback "Invalid Protocol code"
          end
        @chunked_data = ""
      end
    end # end of while loop
  end

  def send_error_without_callback msg
    send_data msg +"\n"
  end

  def dispatch_request
    send_data "#{Time.now.to_s} #{@chunked_data} \n"
  end

  # this method gets automatically called, when a client connects
  # so this place for initializing stuff
  def post_init
    @chunked_data = ""
    @client_status = true
  end

  # method gets called when a client disconnects
  def unbind
    @client_status = false
  end

  def hello_world
    p "Hello World"
  end

end



-- 
gnufied
-----------
There was only one Road; that it was like a great river: its springs
were at every doorstep, and every path was its tributary.


More information about the mocha-developer mailing list