File: README.rdoc

package info (click to toggle)
ruby-em-spec 0.2.6-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 156 kB
  • ctags: 96
  • sloc: ruby: 500; makefile: 2
file content (118 lines) | stat: -rw-r--r-- 3,183 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Simple BDD API for testing asynchronous Ruby/EventMachine code
(c) 2008 Aman Gupta (tmm1)

em-spec can be used with either bacon, test unit or rspec.

=Rspec
There are two ways to use the Rspec extension.  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
  end
The 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
  end

=Bacon
The 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

  end

=Test::Unit
There 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
  end
  
The 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

Resources:

* Git repository: http://github.com/tmm1/em-spec
* Bacon: http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/30b07b651b0662fd
* Initial announcement: http://groups.google.com/group/eventmachine/browse_thread/thread/8b4e7ead72f9d013