assert 2.10.1 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source "https://rubygems.org"
4
4
  gemspec
5
5
 
6
6
  gem 'rake'
7
- gem 'pry'
7
+ gem 'pry', "~> 0.9.0"
8
8
 
9
9
  platform :rbx do
10
10
  gem 'rubysl'
data/README.md CHANGED
@@ -40,7 +40,7 @@ Running tests in random order, seeded with "56382"
40
40
 
41
41
  * **Rspec**
42
42
  * **Unit/Functional/Integration/etc**: Assert is agnostic - you define whatever kinds of tests you like (one or more of the above) and assert runs them in context.
43
- * **Mock/Spec/BDD/Factories/etc**: Assert is the framework and there are a variety of 3rd party tools to do such things - feel free to use whatever you like.
43
+ * **Mock/Spec/BDD/etc**: Assert is the framework and there are a variety of 3rd party tools to do such things - feel free to use whatever you like.
44
44
 
45
45
  ## Description
46
46
 
@@ -50,6 +50,70 @@ In addition, Assert adds some helpers and syntax sugar to enhance the way tests
50
50
 
51
51
  **Note**: Assert is tested using itself. The tests are a pretty good place to look for examples and usage patterns.
52
52
 
53
+ ## Defining tests
54
+
55
+ TODO
56
+
57
+ ## Factory
58
+
59
+ TODO
60
+
61
+ ## Stub
62
+
63
+ ```ruby
64
+ myclass = Class.new do
65
+ def mymeth; 'meth'; end
66
+ def myval(val); val; end
67
+ end
68
+ myobj = myclass.new
69
+
70
+ myobj.mymeth
71
+ # => 'meth'
72
+ myobj.myval(123)
73
+ # => 123
74
+ myobj.myval(456)
75
+ # => 456
76
+
77
+ Assert.stub(myobj, :mymeth)
78
+ myobj.mymeth
79
+ # => StubError: `mymeth` not stubbed.
80
+ Assert.stub(myobj, :mymeth){ 'stub-meth' }
81
+ myobj.mymeth
82
+ # => 'stub-meth'
83
+ myobj.mymeth(123)
84
+ # => StubError: arity mismatch
85
+ Assert.stub(myobj, :mymeth).with(123){ 'stub-meth' }
86
+ # => StubError: arity mismatch
87
+
88
+ Assert.stub(myobj, :myval){ 'stub-meth' }
89
+ # => StubError: arity mismatch
90
+ Assert.stub(myobj, :myval).with(123){ |val| val.to_s }
91
+ myobj.myval
92
+ # => StubError: arity mismatch
93
+ myobj.mymeth(123)
94
+ # => '123'
95
+ myobj.mymeth(456)
96
+ # => StubError: `mymeth(456)` not stubbed.
97
+
98
+ Assert.unstub(myobj, :mymeth)
99
+
100
+ myobj.mymeth
101
+ # => 'meth'
102
+ myobj.myval(123)
103
+ # => 123
104
+ myobj.myval(456)
105
+ # => 456
106
+ ```
107
+
108
+ Assert comes with a simple stubbing API - all it does is replace method calls. In general it tries
109
+ to be friendly and complain if stubbing doesn't match up with the object/method being stubbed:
110
+
111
+ * each stub takes a block that is called in place of the method
112
+ * complains if you stub a method that the object doesn't respond to
113
+ * complains if you stub with an arity mismatch
114
+ * no methods added to `Object`
115
+ * stubs are auto-unstubbed on test teardown
116
+
53
117
  ## CLI
54
118
 
55
119
  ```sh
data/lib/assert.rb CHANGED
@@ -3,6 +3,7 @@ require 'assert/version'
3
3
  require 'assert/config'
4
4
  require 'assert/context'
5
5
  require 'assert/runner'
6
+ require 'assert/stub'
6
7
  require 'assert/suite'
7
8
  require 'assert/utils'
8
9
  require 'assert/view'
@@ -16,4 +17,28 @@ module Assert
16
17
  def self.suite; self.config.suite; end
17
18
  def self.runner; self.config.runner; end
18
19
 
20
+ def self.stubs
21
+ @stubs ||= {}
22
+ end
23
+
24
+ def self.stub(*args, &block)
25
+ (self.stubs[Assert::Stub.key(*args)] ||= Assert::Stub.new(*args)).tap do |s|
26
+ s.do = block
27
+ end
28
+ end
29
+
30
+ def self.unstub(*args)
31
+ (self.stubs.delete(Assert::Stub.key(*args)) || Assert::Stub::NullStub.new).teardown
32
+ end
33
+
34
+ def self.unstub!
35
+ self.stubs.keys.each{ |key| self.stubs.delete(key).teardown }
36
+ end
37
+
38
+ class Context
39
+
40
+ teardown{ Assert.unstub! } # unstub all stubs automatically
41
+
42
+ end
43
+
19
44
  end
@@ -0,0 +1,95 @@
1
+ module Assert
2
+
3
+ StubError = Class.new(ArgumentError)
4
+
5
+ class Stub
6
+
7
+ NullStub = Class.new do
8
+ def teardown; end # no-op
9
+ end
10
+
11
+ def self.key(object, method_name)
12
+ "--#{object.object_id}--#{method_name}--"
13
+ end
14
+
15
+ attr_reader :method_name, :name, :do
16
+
17
+ def initialize(object, method_name, &block)
18
+ @metaclass = class << object; self; end
19
+ @method_name = method_name.to_s
20
+ @name = "__assert_stub__#{@method_name}"
21
+
22
+ setup(object)
23
+
24
+ @do = block || Proc.new do |*args, &block|
25
+ err_msg = "#{inspect_call(args)} not stubbed."
26
+ inspect_lookup_stubs.tap do |stubs|
27
+ err_msg += "\nStubs:\n#{stubs}" if !stubs.empty?
28
+ end
29
+ raise StubError, err_msg
30
+ end
31
+ @lookup = Hash.new{ |hash, key| self.do }
32
+ end
33
+
34
+ def call(*args, &block)
35
+ raise StubError, "artiy mismatch" unless arity_matches?(args)
36
+ @lookup[args].call(*args, &block)
37
+ end
38
+
39
+ def with(*args, &block)
40
+ raise StubError, "artiy mismatch" unless arity_matches?(args)
41
+ @lookup[args] = block
42
+ end
43
+
44
+ def do=(block)
45
+ @do = block || @do
46
+ end
47
+
48
+ def teardown
49
+ @metaclass.send(:undef_method, @method_name)
50
+ @metaclass.send(:alias_method, @method_name, @name)
51
+ @metaclass.send(:undef_method, @name)
52
+ end
53
+
54
+ protected
55
+
56
+ def setup(object)
57
+ unless object.respond_to?(@method_name)
58
+ raise StubError, "#{object.inspect} does not respond to `#{@method_name}`"
59
+ end
60
+ if !object.methods.map(&:to_s).include?(@method_name)
61
+ @metaclass.send(:define_method, @method_name) do |*args, &block|
62
+ super(*args, &block)
63
+ end
64
+ end
65
+
66
+ if !object.respond_to?(@name) # already stubbed
67
+ @metaclass.send(:alias_method, @name, @method_name)
68
+ end
69
+ @method = object.method(@name)
70
+
71
+ stub = self
72
+ @metaclass.send(:define_method, @method_name) do |*args, &block|
73
+ stub.call(*args, &block)
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def arity_matches?(args)
80
+ return true if @method.arity == args.size # mandatory args
81
+ return true if @method.arity < 0 && args.size >= (@method.arity+1).abs # variable args
82
+ return false
83
+ end
84
+
85
+ def inspect_lookup_stubs
86
+ @lookup.keys.map{ |args| " - #{inspect_call(args)}" }.join("\n")
87
+ end
88
+
89
+ def inspect_call(args)
90
+ "`#{@method_name}(#{args.map(&:inspect).join(',')})`"
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -1,3 +1,3 @@
1
1
  module Assert
2
- VERSION = "2.10.1"
2
+ VERSION = "2.11.0"
3
3
  end
@@ -1,14 +1,16 @@
1
1
  require 'assert'
2
2
 
3
3
  require 'assert/config'
4
+ require 'assert/stub'
4
5
 
5
6
  module Assert
6
7
 
7
8
  class UnitTests < Assert::Context
8
- desc "the Assert module"
9
+ desc "Assert"
9
10
  subject { Assert }
10
11
 
11
12
  should have_imeths :config, :configure, :view, :suite, :runner
13
+ should have_imeths :stubs, :stub, :unstub, :unstub!
12
14
 
13
15
  should "know its config instance" do
14
16
  assert_kind_of Assert::Config, subject.config
@@ -25,4 +27,70 @@ module Assert
25
27
 
26
28
  end
27
29
 
30
+ class StubTests < UnitTests
31
+ setup do
32
+ @myclass = Class.new do
33
+ def mymeth; 'meth'; end
34
+ end
35
+ @myobj = @myclass.new
36
+ end
37
+
38
+ should "build a stub" do
39
+ stub1 = Assert.stub(@myobj, :mymeth)
40
+ assert_kind_of Assert::Stub, stub1
41
+ end
42
+
43
+ should "lookup stubs that have been called before" do
44
+ stub1 = Assert.stub(@myobj, :mymeth)
45
+ stub2 = Assert.stub(@myobj, :mymeth)
46
+ assert_same stub1, stub2
47
+ end
48
+
49
+ should "set the stub's do block if given a block" do
50
+ Assert.stub(@myobj, :mymeth)
51
+ assert_raises(StubError){ @myobj.mymeth }
52
+ Assert.stub(@myobj, :mymeth){ 'mymeth' }
53
+ assert_equal 'mymeth', @myobj.mymeth
54
+ end
55
+
56
+ should "teardown stubs" do
57
+ assert_equal 'meth', @myobj.mymeth
58
+ Assert.unstub(@myobj, :mymeth)
59
+ assert_equal 'meth', @myobj.mymeth
60
+
61
+ assert_equal 'meth', @myobj.mymeth
62
+ Assert.stub(@myobj, :mymeth){ 'mymeth' }
63
+ assert_equal 'mymeth', @myobj.mymeth
64
+ Assert.unstub(@myobj, :mymeth)
65
+ assert_equal 'meth', @myobj.mymeth
66
+ end
67
+
68
+ should "know and teardown all stubs" do
69
+ assert_equal 'meth', @myobj.mymeth
70
+
71
+ Assert.stub(@myobj, :mymeth){ 'mymeth' }
72
+ assert_equal 'mymeth', @myobj.mymeth
73
+ assert_equal 1, Assert.stubs.size
74
+
75
+ Assert.unstub!
76
+ assert_equal 'meth', @myobj.mymeth
77
+ assert_empty Assert.stubs
78
+ end
79
+
80
+ should "auto-unstub any stubs on teardown" do
81
+ context_class = ::Factory.modes_off_context_class do
82
+ setup do
83
+ Assert.stub('1', :to_s){ 'one' }
84
+ end
85
+ end
86
+
87
+ context_class.run_setups('scope')
88
+ assert_equal 1, Assert.stubs.size
89
+
90
+ context_class.run_teardowns('scope')
91
+ assert_empty Assert.stubs
92
+ end
93
+
94
+ end
95
+
28
96
  end
@@ -34,7 +34,7 @@ module Assert::Assertions
34
34
 
35
35
  end
36
36
 
37
- class AssertNotIncluded < Assert::Context
37
+ class AssertNotIncludedTests < Assert::Context
38
38
  desc "`assert_not_included`"
39
39
  setup do
40
40
  desc = @desc = "assert not included fail desc"
@@ -5,7 +5,7 @@ require 'assert/utils'
5
5
 
6
6
  module Assert::Assertions
7
7
 
8
- class AssertRespondToTest < Assert::Context
8
+ class AssertRespondToTests < Assert::Context
9
9
  desc "`assert_respond_to`"
10
10
  setup do
11
11
  desc = @desc = "assert respond to fail desc"
@@ -5,7 +5,7 @@ require 'assert/utils'
5
5
 
6
6
  module Assert::Assertions
7
7
 
8
- class AssertSameTest < Assert::Context
8
+ class AssertSameTests < Assert::Context
9
9
  desc "`assert_same`"
10
10
  setup do
11
11
  klass = Class.new; object = klass.new
@@ -4,7 +4,7 @@ require 'assert/assertions'
4
4
  module Assert::Assertions
5
5
 
6
6
  class UnitTests < Assert::Context
7
- desc "An assert context"
7
+ desc "Assert::Context"
8
8
  setup do
9
9
  @context_class = Factory.modes_off_context_class
10
10
  @test = Factory.test
@@ -7,7 +7,7 @@ require 'assert/utils'
7
7
  class Assert::Context
8
8
 
9
9
  class UnitTests < Assert::Context
10
- desc "Assert context"
10
+ desc "Assert::Context"
11
11
  setup do
12
12
  @test = Factory.test
13
13
  @context_class = @test.context_class
@@ -4,7 +4,7 @@ require 'assert/macro'
4
4
  class Assert::Macro
5
5
 
6
6
  class UnitTests < Assert::Context
7
- desc "a macro"
7
+ desc "Assert::Macro"
8
8
  setup do
9
9
  @macro = Assert::Macro.new {}
10
10
  end
@@ -34,7 +34,7 @@ class Assert::Macro
34
34
  end
35
35
 
36
36
  class InstanceMethodsTests < Assert::Context
37
- desc "a class with instance methods"
37
+ desc "have_instance_methods macro: this class"
38
38
  subject do
39
39
  class ::InstExample
40
40
  (1..6).each {|i| define_method("method_#{i}") {}}
@@ -55,7 +55,7 @@ class Assert::Macro
55
55
  end
56
56
 
57
57
  class ClassMethodsTests < Assert::Context
58
- desc "a class with class methods"
58
+ desc "have_class_methods macro: this class"
59
59
  subject do
60
60
  class ::ClassExample
61
61
  class << self
@@ -78,7 +78,7 @@ class Assert::Macro
78
78
  end
79
79
 
80
80
  class ReadersTests < Assert::Context
81
- desc "a class with readers"
81
+ desc "have_readers macro: this class"
82
82
  subject do
83
83
  class ::ReaderExample
84
84
  (1..6).each {|i| attr_reader "method_#{i}"}
@@ -99,7 +99,7 @@ class Assert::Macro
99
99
  end
100
100
 
101
101
  class WritersTests < Assert::Context
102
- desc "a class with writers"
102
+ desc "have_writers macro: this class"
103
103
  subject do
104
104
  class ::WriterExample
105
105
  (1..6).each {|i| attr_writer "method_#{i}"}
@@ -120,7 +120,7 @@ class Assert::Macro
120
120
  end
121
121
 
122
122
  class AccessorsTests < Assert::Context
123
- desc "a class with accessors"
123
+ desc "have_accessors macro: this class"
124
124
  subject do
125
125
  class ::AccessorExample
126
126
  (1..6).each {|i| attr_accessor "method_#{i}"}
@@ -4,7 +4,7 @@ require 'assert/result'
4
4
  module Assert::Result
5
5
 
6
6
  class BacktraceTests < Assert::Context
7
- desc "a result backtrace"
7
+ desc "Assert::Result::Backtrace"
8
8
  setup do
9
9
  @backtrace = Backtrace.new(caller)
10
10
  end
@@ -30,8 +30,8 @@ module Assert::Result
30
30
 
31
31
  end
32
32
 
33
- class UnitTests < Assert::Context
34
- desc "a base result"
33
+ class BaseTests < Assert::Context
34
+ desc "Assert::Result::Base"
35
35
  setup do
36
36
  @test = Factory.test("a test name")
37
37
  @result = Assert::Result::Base.new(@test, "a message", ["line 1", "line2"])
@@ -73,10 +73,6 @@ module Assert::Result
73
73
  assert_equal ['bt'], subject.backtrace
74
74
  end
75
75
 
76
- end
77
-
78
- class ToStringTests < UnitTests
79
-
80
76
  should "include its test context name in the to_s" do
81
77
  assert subject.to_s.include?(subject.test_name)
82
78
  end
@@ -99,14 +95,14 @@ module Assert::Result
99
95
  end
100
96
 
101
97
  class PassTests < Assert::Context
102
- desc "a pass result"
98
+ desc "Assert::Result::Pass"
103
99
  setup do
104
100
  @test = Factory.test("a test name")
105
101
  @result = Assert::Result::Pass.new(@test, "passed", [])
106
102
  end
107
103
  subject { @result }
108
104
 
109
- should "be pass?" do
105
+ should "pass?" do
110
106
  assert_equal true, subject.pass?
111
107
  end
112
108
 
@@ -131,14 +127,14 @@ module Assert::Result
131
127
  end
132
128
 
133
129
  class IgnoreTests < Assert::Context
134
- desc "an ignore result"
130
+ desc "Assert::Result::Ignore"
135
131
  setup do
136
132
  @test = Factory.test("a test name")
137
133
  @result = Assert::Result::Ignore.new(@test, "ignored", [])
138
134
  end
139
135
  subject { @result }
140
136
 
141
- should "be ignore?" do
137
+ should "ignore?" do
142
138
  assert_equal true, subject.ignore?
143
139
  end
144
140
 
@@ -163,7 +159,7 @@ module Assert::Result
163
159
  end
164
160
 
165
161
  class FailTests < Assert::Context
166
- desc "a fail result"
162
+ desc "Assert::Result::Fail"
167
163
  setup do
168
164
  @test = Factory.test("a test name")
169
165
  @result = Assert::Result::Fail.new(@test, "failed", [])
@@ -174,7 +170,7 @@ module Assert::Result
174
170
  assert_kind_of RuntimeError, Assert::Result::TestFailure.new
175
171
  end
176
172
 
177
- should "be fail?" do
173
+ should "fail?" do
178
174
  assert_equal true, subject.fail?
179
175
  end
180
176
 
@@ -199,7 +195,7 @@ module Assert::Result
199
195
  end
200
196
 
201
197
  class SkipTests < Assert::Context
202
- desc "a skip result"
198
+ desc "Assert::Result::Skip"
203
199
  setup do
204
200
  @test = Factory.test("a test name")
205
201
  @exception = nil
@@ -216,7 +212,7 @@ module Assert::Result
216
212
  assert_kind_of RuntimeError, Assert::Result::TestSkipped.new
217
213
  end
218
214
 
219
- should "be skip?" do
215
+ should "skip?" do
220
216
  assert_equal true, subject.skip?
221
217
  end
222
218
 
@@ -241,7 +237,7 @@ module Assert::Result
241
237
  end
242
238
 
243
239
  class ErrorTests < Assert::Context
244
- desc "an error result"
240
+ desc "Assert::Result::Error"
245
241
  setup do
246
242
  @test = Factory.test("a test name")
247
243
  @exception = nil
@@ -254,7 +250,7 @@ module Assert::Result
254
250
  end
255
251
  subject { @result }
256
252
 
257
- should "be error?" do
253
+ should "error?" do
258
254
  assert_equal true, subject.error?
259
255
  end
260
256
 
@@ -5,8 +5,8 @@ require 'assert/runner'
5
5
 
6
6
  class Assert::Runner
7
7
 
8
- class BasicTests < Assert::Context
9
- desc "a basic runner"
8
+ class UnitTests < Assert::Context
9
+ desc "Assert::Runner"
10
10
  setup do
11
11
  @config = Factory.modes_off_config
12
12
  @suite = Assert::Suite.new(@config)
@@ -0,0 +1,195 @@
1
+ require 'assert'
2
+ require 'assert/stub'
3
+
4
+ class Assert::Stub
5
+
6
+ class UnitTests < Assert::Context
7
+ desc "Assert::Stub"
8
+ setup do
9
+ @myclass = Class.new do
10
+ def mymeth; 'meth'; end
11
+ def myval(val); val; end
12
+ def myargs(*args); args; end
13
+ def myvalargs(val1, val2, *args); [val1, val2, args]; end
14
+ def myblk(&block); block.call; end
15
+ end
16
+ @myobj = @myclass.new
17
+
18
+ @stub = Assert::Stub.new(@myobj, :mymeth)
19
+ end
20
+ subject{ @stub }
21
+
22
+ should have_readers :method_name, :name, :do
23
+ should have_writers :do
24
+ should have_cmeths :key
25
+
26
+ should "generate a key given an object and method name" do
27
+ obj = @myobj
28
+ meth = :mymeth
29
+ assert_equal "--#{obj.object_id}--#{meth}--", Assert::Stub.key(obj, meth)
30
+ end
31
+
32
+ should "know its names" do
33
+ assert_equal 'mymeth', subject.method_name
34
+ assert_equal "__assert_stub__#{subject.method_name}", subject.name
35
+ end
36
+
37
+ should "complain when called if no do block was given" do
38
+ assert_raises Assert::StubError do
39
+ @myobj.mymeth
40
+ end
41
+
42
+ subject.do = proc{ 'mymeth' }
43
+ assert_nothing_raised do
44
+ @myobj.mymeth
45
+ end
46
+
47
+ assert_nothing_raised do
48
+ Assert::Stub.new(@myobj, :mymeth){ 'mymeth' }
49
+ end
50
+ end
51
+
52
+ should "complain if stubbing a method that the object doesn't respond to" do
53
+ assert_raises Assert::StubError do
54
+ Assert::Stub.new(@myobj, :some_other_meth)
55
+ end
56
+ end
57
+
58
+ should "complain if stubbed and called with no `do` proc given" do
59
+ assert_raises(Assert::StubError){ @myobj.mymeth }
60
+ end
61
+
62
+ should "complain if stubbed and called with mismatched arity" do
63
+ Assert::Stub.new(@myobj, :myval){ 'myval' }
64
+ assert_raises(Assert::StubError){ @myobj.myval }
65
+ assert_nothing_raised { @myobj.myval(1) }
66
+ assert_raises(Assert::StubError){ @myobj.myval(1,2) }
67
+
68
+ Assert::Stub.new(@myobj, :myargs){ 'myargs' }
69
+ assert_nothing_raised { @myobj.myargs }
70
+ assert_nothing_raised { @myobj.myargs(1) }
71
+ assert_nothing_raised { @myobj.myargs(1,2) }
72
+
73
+ Assert::Stub.new(@myobj, :myvalargs){ 'myvalargs' }
74
+ assert_raises(Assert::StubError){ @myobj.myvalargs }
75
+ assert_raises(Assert::StubError){ @myobj.myvalargs(1) }
76
+ assert_nothing_raised { @myobj.myvalargs(1,2) }
77
+ assert_nothing_raised { @myobj.myvalargs(1,2,3) }
78
+ end
79
+
80
+ should "complain if stubbed with mismatched arity" do
81
+ assert_raises(Assert::StubError) do
82
+ Assert::Stub.new(@myobj, :myval).with(){ 'myval' }
83
+ end
84
+ assert_raises(Assert::StubError) do
85
+ Assert::Stub.new(@myobj, :myval).with(1,2){ 'myval' }
86
+ end
87
+ assert_nothing_raised do
88
+ Assert::Stub.new(@myobj, :myval).with(1){ 'myval' }
89
+ end
90
+
91
+ assert_nothing_raised do
92
+ Assert::Stub.new(@myobj, :myargs).with(){ 'myargs' }
93
+ end
94
+ assert_nothing_raised do
95
+ Assert::Stub.new(@myobj, :myargs).with(1,2){ 'myargs' }
96
+ end
97
+ assert_nothing_raised do
98
+ Assert::Stub.new(@myobj, :myargs).with(1){ 'myargs' }
99
+ end
100
+
101
+ assert_raises(Assert::StubError) do
102
+ Assert::Stub.new(@myobj, :myvalargs).with(){ 'myvalargs' }
103
+ end
104
+ assert_raises(Assert::StubError) do
105
+ Assert::Stub.new(@myobj, :myvalargs).with(1){ 'myvalargs' }
106
+ end
107
+ assert_nothing_raised do
108
+ Assert::Stub.new(@myobj, :myvalargs).with(1,2){ 'myvalargs' }
109
+ end
110
+ assert_nothing_raised do
111
+ Assert::Stub.new(@myobj, :myvalargs).with(1,2,3){ 'myvalargs' }
112
+ end
113
+ end
114
+
115
+ should "stub methods with no args" do
116
+ subject.teardown
117
+
118
+ assert_equal 'meth', @myobj.mymeth
119
+ Assert::Stub.new(@myobj, :mymeth){ 'mymeth' }
120
+ assert_equal 'mymeth', @myobj.mymeth
121
+ end
122
+
123
+ should "stub methods with required arg" do
124
+ assert_equal 1, @myobj.myval(1)
125
+ stub = Assert::Stub.new(@myobj, :myval){ |val| val.to_s }
126
+ assert_equal '1', @myobj.myval(1)
127
+ assert_equal '2', @myobj.myval(2)
128
+ stub.with(2){ 'two' }
129
+ assert_equal 'two', @myobj.myval(2)
130
+ end
131
+
132
+ should "stub methods with variable args" do
133
+ assert_equal [1,2], @myobj.myargs(1,2)
134
+ stub = Assert::Stub.new(@myobj, :myargs){ |*args| args.join(',') }
135
+ assert_equal '1,2', @myobj.myargs(1,2)
136
+ assert_equal '3,4,5', @myobj.myargs(3,4,5)
137
+ stub.with(3,4,5){ 'three-four-five' }
138
+ assert_equal 'three-four-five', @myobj.myargs(3,4,5)
139
+ end
140
+
141
+ should "stub methods with required args and variable args" do
142
+ assert_equal [1,2, [3]], @myobj.myvalargs(1,2,3)
143
+ stub = Assert::Stub.new(@myobj, :myvalargs){ |*args| args.join(',') }
144
+ assert_equal '1,2,3', @myobj.myvalargs(1,2,3)
145
+ assert_equal '3,4,5', @myobj.myvalargs(3,4,5)
146
+ stub.with(3,4,5){ 'three-four-five' }
147
+ assert_equal 'three-four-five', @myobj.myvalargs(3,4,5)
148
+ end
149
+
150
+ should "stub methods that yield blocks" do
151
+ blkcalled = false
152
+ blk = proc{ blkcalled = true }
153
+ @myobj.myblk(&blk)
154
+ assert_equal true, blkcalled
155
+
156
+ blkcalled = false
157
+ Assert::Stub.new(@myobj, :myblk){ blkcalled = 'true' }
158
+ @myobj.myblk(&blk)
159
+ assert_equal 'true', blkcalled
160
+ end
161
+
162
+ should "stub methods even if they are from a super class" do
163
+ mysubclass = Class.new(@myclass)
164
+ mysubobj = mysubclass.new
165
+
166
+ assert_equal 1, mysubobj.myval(1)
167
+ stub = Assert::Stub.new(mysubobj, :myval){ |val| val.to_s }
168
+ assert_equal '1', mysubobj.myval(1)
169
+ assert_equal '2', mysubobj.myval(2)
170
+ stub.with(2){ 'two' }
171
+ assert_equal 'two', mysubobj.myval(2)
172
+ end
173
+
174
+ should "be removable" do
175
+ assert_equal 1, @myobj.myval(1)
176
+ stub = Assert::Stub.new(@myobj, :myval){ |val| val.to_s }
177
+ assert_equal '1', @myobj.myval(1)
178
+ stub.teardown
179
+ assert_equal 1, @myobj.myval(1)
180
+ end
181
+
182
+ end
183
+
184
+ class NullStubTests < UnitTests
185
+ desc "NullStub"
186
+ setup do
187
+ @ns = NullStub.new
188
+ end
189
+ subject{ @ns }
190
+
191
+ should have_imeths :teardown
192
+
193
+ end
194
+
195
+ end
@@ -5,8 +5,8 @@ require 'assert/config'
5
5
 
6
6
  class Assert::Test
7
7
 
8
- class BasicTests < Assert::Context
9
- desc "a test obj"
8
+ class UnitTests < Assert::Context
9
+ desc "Assert::Test"
10
10
  setup do
11
11
  @test_code = lambda{ assert(true) }
12
12
  @context_class = Factory.modes_off_context_class{ desc "context class" }
@@ -68,7 +68,7 @@ class Assert::Test
68
68
 
69
69
  end
70
70
 
71
- class PassFailIgnoreTotalTests < BasicTests
71
+ class PassFailIgnoreTotalTests < UnitTests
72
72
  setup do
73
73
  @test = Factory.test("pass fail ignore test", @context_info) do
74
74
  ignore("something")
@@ -122,7 +122,7 @@ class Assert::Test
122
122
 
123
123
  end
124
124
 
125
- class SkipHandlingTests < BasicTests
125
+ class SkipHandlingTests < UnitTests
126
126
  setup do
127
127
  @test = Factory.test("skip test", @context_info){ skip }
128
128
  @test.run
@@ -163,7 +163,7 @@ class Assert::Test
163
163
 
164
164
  end
165
165
 
166
- class ErrorHandlingTests < BasicTests
166
+ class ErrorHandlingTests < UnitTests
167
167
  setup do
168
168
  @test = Factory.test("error test", @context_info) do
169
169
  raise StandardError, "WHAT"
@@ -206,7 +206,7 @@ class Assert::Test
206
206
 
207
207
  end
208
208
 
209
- class SignalExceptionHandlingTests < BasicTests
209
+ class SignalExceptionHandlingTests < UnitTests
210
210
  setup do
211
211
  @test = Factory.test("signal test", @context_info) do
212
212
  raise SignalException, "USR1"
@@ -234,7 +234,7 @@ class Assert::Test
234
234
 
235
235
  end
236
236
 
237
- class ComparingTests < BasicTests
237
+ class ComparingTests < UnitTests
238
238
  desc "<=> another test"
239
239
  setup do
240
240
  @test = Factory.test("mmm")
@@ -258,7 +258,7 @@ class Assert::Test
258
258
 
259
259
  end
260
260
 
261
- class CaptureOutTests < BasicTests
261
+ class CaptureOutTests < UnitTests
262
262
  desc "when capturing std out"
263
263
  setup do
264
264
  @capture_config = Assert::Config.new(:capture_output => true)
@@ -47,10 +47,11 @@ class Assert::View::Base
47
47
  end
48
48
 
49
49
  class HandlerTests < Assert::Context
50
- desc 'the assert view handler'
50
+ desc "Assert::View"
51
51
  subject { Assert::View }
52
52
 
53
53
  should have_instance_method :require_user_view
54
+
54
55
  end
55
56
 
56
57
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assert
3
3
  version: !ruby/object:Gem::Version
4
- hash: 37
4
+ hash: 35
5
5
  prerelease:
6
6
  segments:
7
7
  - 2
8
- - 10
9
- - 1
10
- version: 2.10.1
8
+ - 11
9
+ - 0
10
+ version: 2.11.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,12 +16,10 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2014-04-24 00:00:00 Z
19
+ date: 2014-06-17 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- type: :runtime
23
- name: ansi
24
- version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ requirement: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
27
25
  - - ~>
@@ -31,8 +29,10 @@ dependencies:
31
29
  - 1
32
30
  - 3
33
31
  version: "1.3"
32
+ type: :runtime
33
+ name: ansi
34
+ version_requirements: *id001
34
35
  prerelease: false
35
- requirement: *id001
36
36
  description: Test::Unit style testing framework, just better than Test::Unit.
37
37
  email:
38
38
  - kelly@kellyredding.com
@@ -67,6 +67,7 @@ files:
67
67
  - lib/assert/macros/methods.rb
68
68
  - lib/assert/result.rb
69
69
  - lib/assert/runner.rb
70
+ - lib/assert/stub.rb
70
71
  - lib/assert/suite.rb
71
72
  - lib/assert/test.rb
72
73
  - lib/assert/utils.rb
@@ -108,6 +109,7 @@ files:
108
109
  - test/unit/macro_tests.rb
109
110
  - test/unit/result_tests.rb
110
111
  - test/unit/runner_tests.rb
112
+ - test/unit/stub_tests.rb
111
113
  - test/unit/suite_tests.rb
112
114
  - test/unit/test_tests.rb
113
115
  - test/unit/utils_tests.rb
@@ -142,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
144
  requirements: []
143
145
 
144
146
  rubyforge_project:
145
- rubygems_version: 1.8.15
147
+ rubygems_version: 1.8.25
146
148
  signing_key:
147
149
  specification_version: 3
148
150
  summary: Test::Unit style testing framework, just better than Test::Unit.
@@ -178,6 +180,7 @@ test_files:
178
180
  - test/unit/macro_tests.rb
179
181
  - test/unit/result_tests.rb
180
182
  - test/unit/runner_tests.rb
183
+ - test/unit/stub_tests.rb
181
184
  - test/unit/suite_tests.rb
182
185
  - test/unit/test_tests.rb
183
186
  - test/unit/utils_tests.rb