flexmock 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,6 +1,11 @@
1
1
  = Changes for FlexMock
2
2
 
3
- == Pre Version 0.3.3
3
+ == Version 0.4.1
4
+
5
+ * Removed include of Test::Unit::Assertions from Expectations.
6
+ * Fixed mocking of kernel methods.
7
+
8
+ == Version 0.4.0
4
9
 
5
10
  * Added stubbing for mocking methods of existing objects.
6
11
  * Added multiple return values for the +and_returns+ method.
data/README CHANGED
@@ -3,7 +3,7 @@
3
3
  FlexMock is a simple, but flexible, mock object library for Ruby unit
4
4
  testing.
5
5
 
6
- Version :: 0.4.0
6
+ Version :: 0.4.1
7
7
 
8
8
  = Links
9
9
 
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ require 'rake/testtask'
9
9
  CLEAN.include('*.tmp')
10
10
  CLOBBER.include("html", 'pkg')
11
11
 
12
- PKG_VERSION = '0.4.0'
12
+ PKG_VERSION = '0.4.1'
13
13
 
14
14
  PKG_FILES = FileList[
15
15
  '[A-Z]*',
@@ -147,6 +147,8 @@ task :tag do
147
147
  sh %{svn copy #{SVNHOME}/trunk #{SVNHOME}/tags/rel-#{PKG_VERSION} -m 'Release #{PKG_VERSION}'}
148
148
  end
149
149
 
150
+ RUBY_FILES = FileList['**/*.rb']
151
+ RUBY_FILES.exclude(/^pkg/)
150
152
  task :dbg do
151
- FileList['**/*.rb'].egrep(/DBG/)
153
+ RUBY_FILES.egrep(/DBG/)
152
154
  end
@@ -0,0 +1,87 @@
1
+ = FlexMock 0.4.1 Released
2
+
3
+ FlexMock is a flexible mocking library for use in Ruby's Test::Unit
4
+ test framework. Version 0.4.0 enhances FlexMock with the ability to
5
+ stub and mock methods in existing objects.
6
+
7
+ == New in 0.4.1
8
+
9
+ Coming fast on the heels of 0.4.0, version 0.4.1 fixes a problem with
10
+ mocking methods that have the same name as methods defined in Kernel.
11
+
12
+ == What is FlexMock?
13
+
14
+ FlexMock is a flexible Ruby mocking library that works with Ruby's
15
+ Test::Unit framework to create easy to use mocks.
16
+
17
+ === Features
18
+
19
+ * Easy integration with Test::Unit. Mocks created with the flexmock
20
+ method are automatically verified at the end of the test.
21
+
22
+ * A fluent interface that allows mock behavior to be specified very
23
+ easily.
24
+
25
+ * A "record mode" where an existing implementation can record its
26
+ interaction with a mock for later validation against a new
27
+ implementation.
28
+
29
+ * Easy mocking of individual methods in existing, non-mock objects.
30
+
31
+ === Example
32
+
33
+ Suppose you had a Dog object that wagged a tail when it was happy.
34
+ Something like this:
35
+
36
+ class Dog
37
+ def initialize(a_tail)
38
+ @tail = a_tail
39
+ end
40
+ def happy
41
+ @tail.wag
42
+ end
43
+ end
44
+
45
+ To test the +Dog+ class without a real +Tail+ object (perhaps because
46
+ real +Tail+ objects activate servos in some robotic equipment), you
47
+ can do something like this:
48
+
49
+ require 'test/unit'
50
+ require 'flexmock'
51
+
52
+ class TestDog < Test::Unit::TestCase
53
+ include FlexMock::TestCase
54
+
55
+ def test_dog_wags_tail_when_happy
56
+ tail = flexmock("tail")
57
+ tail.should_receive(:wag).once
58
+ dog = Dog.new(tail)
59
+ dog.happy
60
+ end
61
+ end
62
+
63
+ FlexMock will automatically verify that the mocked tail object
64
+ received the message +wag+ exactly one time. If it doesn't, the test
65
+ will not pass.
66
+
67
+ See the FlexMock documentation at
68
+ http://onestepback.org/software/flexmock for details on specifying
69
+ arguments and return values on mocked methods, as well as a simple
70
+ technique for mocking tail objects when the Dog class creates the tail
71
+ objects directly.
72
+
73
+ == Availability
74
+
75
+ FlexMock is distributed with Rails, or you can make sure you have the
76
+ latest version with a quick RubyGems command:
77
+
78
+ gem install flexmock (you may need root/admin privileges)
79
+
80
+ Otherwise, you can get it from the more traditional places:
81
+
82
+ Download:: http://rubyforge.org/project/showfiles.php?group_id=170
83
+
84
+ You will find documentation at:
85
+ http://onestepback.org/software/flexmock/
86
+
87
+ -- Jim Weirich
data/lib/flexmock.rb CHANGED
@@ -115,6 +115,9 @@ class FlexMock
115
115
  end
116
116
  end
117
117
 
118
+ # Save the original definition of respond_to? for use a bit later.
119
+ alias mock_respond_to? respond_to?
120
+
118
121
  # Override the built-in respond_to? to include the mocked methods.
119
122
  def respond_to?(sym)
120
123
  super || (@expectations[sym] ? true : @ignore_missing)
@@ -141,9 +144,26 @@ class FlexMock
141
144
  @expectations[sym] ||= ExpectationDirector.new(sym)
142
145
  result = Expectation.new(self, sym)
143
146
  @expectations[sym] << result
147
+ override_existing_method(sym) if mock_respond_to?(sym)
144
148
  result
145
149
  end
146
150
 
151
+ # Override the existing definition of method +sym+ in the mock.
152
+ # Most methods depend on the method_missing trick to be invoked.
153
+ # However, if the method already exists, it will not call
154
+ # method_missing. This method defines a singleton method on the
155
+ # mock to explicitly invoke the method_missing logic.
156
+ def override_existing_method(sym)
157
+ sclass.class_eval "def #{sym}(*args, &block) method_missing(:#{sym}, *args, &block) end"
158
+ end
159
+ private :override_existing_method
160
+
161
+ # Return the singleton class of the mock object.
162
+ def sclass
163
+ class << self; self; end
164
+ end
165
+ private :sclass
166
+
147
167
  # Declare that the mock object should expect methods by providing a
148
168
  # recorder for the methods and having the user invoke the expected
149
169
  # methods in a block. Further expectations may be applied the
@@ -12,6 +12,17 @@
12
12
  require 'test/unit'
13
13
  require 'flexmock'
14
14
 
15
+ def mock_top_level_function
16
+ :mtlf
17
+ end
18
+
19
+
20
+ module Kernel
21
+ def mock_kernel_function
22
+ :mkf
23
+ end
24
+ end
25
+
15
26
  class TestFlexMockShoulds < Test::Unit::TestCase
16
27
 
17
28
  def test_defaults
@@ -566,6 +577,26 @@ class TestFlexMockShoulds < Test::Unit::TestCase
566
577
  end
567
578
  end
568
579
 
580
+ def test_global_methods_can_be_mocked
581
+ m = FlexMock.new("m")
582
+ m.should_receive(:mock_top_level_function).and_return(:mock)
583
+ assert_equal :mock, m.mock_top_level_function
584
+ end
585
+
586
+ def test_kernel_methods_can_be_mocked
587
+ m = FlexMock.new("m")
588
+ m.should_receive(:mock_kernel_function).and_return(:mock)
589
+ assert_equal :mock, m.mock_kernel_function
590
+ end
591
+
592
+ def test_undefing_kernel_methods_dont_effect_other_mocks
593
+ m = FlexMock.new("m")
594
+ m2 = FlexMock.new("m2")
595
+ m.should_receive(:mock_kernel_function).and_return(:mock)
596
+ assert_equal :mock, m.mock_kernel_function
597
+ assert_equal :mkf, m2.mock_kernel_function
598
+ end
599
+
569
600
  def assert_failure
570
601
  assert_raises(Test::Unit::AssertionFailedError) do yield end
571
602
  end
@@ -107,6 +107,15 @@ class TestStubbing < Test::Unit::TestCase
107
107
  def m.mock_verify() end
108
108
  end
109
109
 
110
+ def test_not_calling_stubbed_method_is_an_error
111
+ dog = Dog.new
112
+ flexstub(dog).should_receive(:bark).once
113
+ assert_raise(Test::Unit::AssertionFailedError) {
114
+ flexstub(dog).mock_verify
115
+ }
116
+ dog.bark
117
+ end
118
+
110
119
  def test_mock_is_verified_when_the_stub_is_verified
111
120
  obj = Object.new
112
121
  stub_proxy = flexstub(obj)
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0.1
3
3
  specification_version: 1
4
4
  name: flexmock
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.4.0
7
- date: 2006-09-04 00:00:00 -04:00
6
+ version: 0.4.1
7
+ date: 2006-09-07 00:00:00 -04:00
8
8
  summary: Simple and Flexible Mock Objects for Testing
9
9
  require_paths:
10
10
  - lib
@@ -45,6 +45,7 @@ files:
45
45
  - flexmock.blurb
46
46
  - install.rb
47
47
  - doc/releases/flexmock-0.4.0.rdoc
48
+ - doc/releases/flexmock-0.4.1.rdoc
48
49
  test_files: []
49
50
 
50
51
  rdoc_options:
@@ -57,6 +58,7 @@ extra_rdoc_files:
57
58
  - README
58
59
  - CHANGELOG
59
60
  - doc/releases/flexmock-0.4.0.rdoc
61
+ - doc/releases/flexmock-0.4.1.rdoc
60
62
  executables: []
61
63
 
62
64
  extensions: []