chai-backbone-rails 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitmodules +9 -0
- data/Gemfile +1 -0
- data/README.md +36 -120
- data/USAGE-CHANGES.md +74 -0
- data/lib/assets/javascripts/chai-backbone-rails-spec.js.coffee +3 -0
- data/lib/assets/javascripts/chai-backbone-rails.js.coffee +3 -0
- data/lib/chai-backbone-rails/version.rb +1 -1
- data/vendor/assets/javascripts/chai-backbone.js.coffee +21 -2
- data/vendor/assets/javascripts/chai-changes.js.coffee +6 -9
- data/vendor/assets/javascripts/factories.js.coffee +2 -0
- data/vendor/assets/javascripts/spec/chai-backbone_spec.js.coffee +28 -1
- data/vendor/assets/javascripts/spec/chai-changes_spec.js.coffee +5 -3
- data/vendor/assets/javascripts/spec/factory_spec.js.coffee +13 -14
- metadata +22 -42
- data/vendor/assets/javascripts/chai-backbone_spec.js.coffee +0 -4
- data/vendor/assets/javascripts/chai-sinon.js.coffee +0 -58
- data/vendor/assets/javascripts/sinon-1.4.2.js +0 -4081
- data/vendor/assets/javascripts/spec/chai-sinon_spec.js.coffee +0 -96
data/.gitmodules
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
[submodule "chai-backbone"]
|
2
|
+
path = chai-backbone
|
3
|
+
url = git://github.com/matthijsgroen/chai-backbone.git
|
4
|
+
[submodule "chai-changes"]
|
5
|
+
path = chai-changes
|
6
|
+
url = git://github.com/matthijsgroen/chai-changes.git
|
7
|
+
[submodule "js-factories"]
|
8
|
+
path = js-factories
|
9
|
+
url = git://github.com/matthijsgroen/js-factories.git
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
Backbone
|
2
|
-
|
1
|
+
Chai-Backbone-Rails
|
2
|
+
===================
|
3
3
|
|
4
|
-
- Adds Chai matchers for common backbone assertions
|
5
4
|
- Adds Chai matchers to assert changes
|
6
|
-
- Adds Chai matchers for common
|
5
|
+
- Adds Chai matchers for common backbone assertions
|
7
6
|
- Adds support for Factories
|
8
7
|
|
9
8
|
Installation
|
@@ -21,69 +20,50 @@ Or install it yourself as:
|
|
21
20
|
|
22
21
|
$ gem install chai-backbone-rails
|
23
22
|
|
24
|
-
|
25
|
-
|
23
|
+
Dependencies
|
24
|
+
------------
|
26
25
|
|
27
|
-
|
26
|
+
The provided libraries have dependencies to
|
27
|
+
[backbone](http://documentcloud.github.com/backbone/),
|
28
|
+
[underscore](http://documentcloud.github.com/underscore/) and
|
29
|
+
[sinon](http://sinonjs.org/)
|
28
30
|
|
29
|
-
|
31
|
+
to install these dependencies, you can add the following to your
|
32
|
+
`Gemfile`:
|
30
33
|
|
31
|
-
|
34
|
+
gem 'sinonjs-rails'
|
35
|
+
gem 'rails-backbone'
|
32
36
|
|
33
|
-
|
37
|
+
and in your `spec_helper`:
|
34
38
|
|
35
|
-
|
36
|
-
|
39
|
+
#= require sinon/sinon-1.5.0
|
40
|
+
#= require underscore
|
41
|
+
#= require backbone
|
42
|
+
#= require chai-backbone-rails
|
37
43
|
|
38
|
-
|
44
|
+
to run all specs of the libraries:
|
39
45
|
|
40
|
-
|
41
|
-
"page/3".should.route.to myRouter, "openPage", considering: [conflictingRouter]
|
46
|
+
#= require chai-backbone-rails-spec
|
42
47
|
|
43
48
|
Using Changes Chai matchers
|
44
49
|
---------------------------
|
45
50
|
|
46
51
|
#= require chai-changes
|
47
52
|
|
48
|
-
|
49
|
-
|
50
|
-
expect(-> result).to.change.when -> result += 1
|
51
|
-
expect(-> result).to.not.change.when -> somethingElse()
|
52
|
-
|
53
|
-
Changes by delta: 'change.by'
|
54
|
-
|
55
|
-
expect(-> view.$('p').length).to.change.by(4).when -> collection.add [{}, {}, {}, {}]
|
56
|
-
|
57
|
-
Changes to end result: 'change.to'
|
58
|
-
|
59
|
-
result = ['a']
|
60
|
-
expect(-> result).to.change.to(['b']).when -> result = ['b']
|
61
|
-
|
62
|
-
Changes from begin result: 'change.from'
|
53
|
+
See [the Chai-changes plugin page](http://chaijs.com/plugins/chai-changes)
|
63
54
|
|
64
|
-
|
65
|
-
expect(-> result).to.change.from(['a']).when -> result = ['b']
|
55
|
+
or [the Node.js package page](https://npmjs.org/package/chai-changes)
|
66
56
|
|
67
|
-
Mix and match:
|
68
57
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
Using Sinon Chai Matchers
|
74
|
-
-------------------------
|
58
|
+
Using Backbone Chai Matchers
|
59
|
+
----------------------------
|
75
60
|
|
76
|
-
|
61
|
+
#= require chai-backbone
|
77
62
|
|
78
|
-
|
63
|
+
See [the Chai-backbone plugin page](http://chaijs.com/plugins/chai-backbone)
|
79
64
|
|
80
|
-
|
65
|
+
or [the Node.js package page](https://npmjs.org/package/chai-backbone)
|
81
66
|
|
82
|
-
spy.should.have.been.called.exactly(x).times
|
83
|
-
spy.should.have.been.called.before otherSpy
|
84
|
-
spy.should.have.been.called.after otherSpy
|
85
|
-
spy.should.have.been.called.with "argument1", 2, "argument3"
|
86
|
-
spy.should.not.have.been.called
|
87
67
|
|
88
68
|
Using Factories
|
89
69
|
---------------
|
@@ -93,98 +73,34 @@ other objects as you see fit:
|
|
93
73
|
|
94
74
|
#= require factories
|
95
75
|
|
96
|
-
|
97
|
-
new User attributes
|
98
|
-
|
99
|
-
Factory.create 'user', name: 'Matthijs'
|
100
|
-
|
101
|
-
### Traits
|
102
|
-
|
103
|
-
you can also use 'traits'.
|
104
|
-
Traits are flags that are set when the user calls create with the
|
105
|
-
factory name prefixed with terms separated by dashes.
|
106
|
-
|
107
|
-
Like: 'female-admin-user'
|
108
|
-
|
109
|
-
This will call the 'user' factory, and provide the terms 'female' and
|
110
|
-
'admin' as traits for this user
|
111
|
-
|
112
|
-
this list is accessible in the factory callback using `this.traits`
|
76
|
+
See [the Node.js package page](https://npmjs.org/package/js-factories)
|
113
77
|
|
114
|
-
There are 2 helper methods to help check if traits are set:
|
115
|
-
|
116
|
-
this.trait('returns', 'one', 'of', 'these', 'values')
|
117
|
-
|
118
|
-
and
|
119
|
-
|
120
|
-
this.is('admin') # returns a boolean value
|
121
|
-
|
122
|
-
Extended example:
|
123
|
-
|
124
|
-
Factory.define 'user', (attributes = {}) ->
|
125
|
-
attributes.gender = @trait('male', 'female') || 'male'
|
126
|
-
|
127
|
-
returningClass = User
|
128
|
-
if @is('admin')
|
129
|
-
returningClass = AdminUser
|
130
|
-
|
131
|
-
new returningClass attributes
|
132
|
-
|
133
|
-
Factory.create 'user', name: 'Matthijs' # => new User name: 'Matthijs'
|
134
|
-
Factory.create 'male-user', name: 'Matthijs' # => new User name: 'Matthijs', gender: 'male'
|
135
|
-
Factory.create 'male-admin-user', name: 'Matthijs' # => new AdminUser name: 'Matthijs', gender: 'male'
|
136
|
-
Factory.create 'female-user', name: 'Beppie' # => new User name: 'Beppie', gender: 'female'
|
137
|
-
|
138
|
-
### Sequences
|
139
|
-
|
140
|
-
Sequences are also supported:
|
141
|
-
|
142
|
-
Factory.define 'counter', ->
|
143
|
-
{
|
144
|
-
amount: @sequence('amount')
|
145
|
-
other: @sequence('other')
|
146
|
-
}
|
147
|
-
|
148
|
-
This does not conflict with similar names in other factory definitions.
|
149
|
-
|
150
|
-
You can also yield results:
|
151
|
-
|
152
|
-
Factory.define 'abc', ->
|
153
|
-
@sequence (i) -> ['a','b','c'][i]
|
154
|
-
|
155
|
-
# results in:
|
156
|
-
Factory.create('abc') => 'a'
|
157
|
-
Factory.create('abc') => 'b'
|
158
|
-
|
159
|
-
### Sampling
|
160
|
-
|
161
|
-
You can sample a value from a list
|
162
|
-
|
163
|
-
Factory.define 'sampler', ->
|
164
|
-
@sample 'a', 'b', 'c'
|
165
|
-
|
166
|
-
Will randomly return a, b or c every time
|
167
78
|
|
168
79
|
Running the tests
|
169
80
|
=================
|
170
81
|
|
171
|
-
You can
|
82
|
+
You can run the tests by including:
|
172
83
|
|
173
84
|
#= require chai-backbone_spec
|
174
85
|
|
175
86
|
or you can run the suites seperately:
|
176
87
|
|
177
88
|
#= require spec/chai-backbone_spec
|
178
|
-
#= require spec/chai-sinon_spec
|
179
89
|
#= require spec/chai-changes_spec
|
180
90
|
#= require spec/factory_spec
|
181
91
|
|
182
92
|
|
183
93
|
Contributing
|
184
|
-
|
94
|
+
============
|
185
95
|
|
186
96
|
1. Fork it
|
187
97
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
188
98
|
3. Commit your changes (`git commit -am 'Added some feature'`)
|
189
99
|
4. Push to the branch (`git push origin my-new-feature`)
|
190
100
|
5. Create new Pull Request
|
101
|
+
|
102
|
+
Todo
|
103
|
+
----
|
104
|
+
|
105
|
+
- Add a rake task to update dependencies
|
106
|
+
|
data/USAGE-CHANGES.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
chai-changes
|
2
|
+
============
|
3
|
+
|
4
|
+
chai-changes is an extension to the [chai](http://chaijs.com/) assertion library that
|
5
|
+
provides a set of change-specific assertions.
|
6
|
+
|
7
|
+
Usage
|
8
|
+
-----
|
9
|
+
|
10
|
+
Include `chai-changes.js` in your test file, after `chai.js` (version 1.0.0-rc1 or later):
|
11
|
+
|
12
|
+
<script src="chai-changes.js"></script>
|
13
|
+
|
14
|
+
Use the assertions with chai's `expect` or `should` assertions.
|
15
|
+
|
16
|
+
Assertions
|
17
|
+
----------
|
18
|
+
|
19
|
+
All assertions use a `when` mechanism.
|
20
|
+
|
21
|
+
|
22
|
+
Using 'expect':
|
23
|
+
|
24
|
+
expect(-> codeThatYieldsAChangedResult).to....when ->
|
25
|
+
executeTheCodeThatCausesTheChange()
|
26
|
+
|
27
|
+
The code within the `expect` section will be executed first, then the
|
28
|
+
code in the `when` section will be executed and then the code in the
|
29
|
+
`expect` section will be executed again and the differences will be
|
30
|
+
asserted.
|
31
|
+
|
32
|
+
Same test using 'should':
|
33
|
+
|
34
|
+
(-> codeThatYieldsAChangedResult).should....when ->
|
35
|
+
executeTheCodeThatCausesTheChange()
|
36
|
+
|
37
|
+
### `change`
|
38
|
+
|
39
|
+
Assert if the 'expect/should' changes its outcome when 'when' is
|
40
|
+
executed
|
41
|
+
|
42
|
+
result = 0
|
43
|
+
(-> result).should.change.when -> result += 1
|
44
|
+
expect(-> result).to.change.when -> result -= 1
|
45
|
+
expect(-> result).not.to.change.when -> result = result * 1
|
46
|
+
|
47
|
+
### `change.by(delta)`
|
48
|
+
|
49
|
+
Assert if the change of the 'expect/should' has the provided delta
|
50
|
+
|
51
|
+
result = 0
|
52
|
+
(-> result).should.change.by(3).when -> result += 3
|
53
|
+
expect(-> result).not.to.change.by(-3).when -> result += 1
|
54
|
+
expect(-> result).to.change.by(-2).when -> result -= 2
|
55
|
+
|
56
|
+
### `change.from(startValue)`
|
57
|
+
|
58
|
+
Assert if the change starts from a certain value. The value is
|
59
|
+
compared using a deep equal.
|
60
|
+
|
61
|
+
result = ['a', 'b']
|
62
|
+
(-> result).should.change.from(['a', 'b']).when -> result.push('c')
|
63
|
+
(-> result).should.change.from(['a', 'b']).to(['a', 'b', 'c']).when -> result.push('c')
|
64
|
+
|
65
|
+
### `change.to(endValue)`
|
66
|
+
|
67
|
+
Assert if the change ends in a certain value. The value is
|
68
|
+
compared using a deep equal.
|
69
|
+
|
70
|
+
result = ['a', 'b']
|
71
|
+
(-> result).should.change.to(['a', 'b', 'c']).when -> result.push('c')
|
72
|
+
(-> result).should.change.from(['a', 'b']).to(['a', 'c']).when -> result = ['a', 'c']
|
73
|
+
|
74
|
+
|
@@ -1,5 +1,3 @@
|
|
1
|
-
#= require underscore
|
2
|
-
#= require ./chai-changes
|
3
1
|
|
4
2
|
((chaiBackbone) ->
|
5
3
|
# Module systems magic dance.
|
@@ -116,5 +114,26 @@
|
|
116
114
|
else
|
117
115
|
_super.apply(this, arguments)
|
118
116
|
|
117
|
+
chai.Assertion.addMethod 'call', (methodName) ->
|
118
|
+
object = flag(this, 'object')
|
119
|
+
definedActions = flag(this, 'whenActions') || []
|
120
|
+
definedActions.push
|
121
|
+
negate: flag(this, 'negate')
|
122
|
+
before: (context) ->
|
123
|
+
@originalMethod = object[methodName]
|
124
|
+
@spy = sinon.spy()
|
125
|
+
object[methodName] = @spy
|
126
|
+
object.delegateEvents?()
|
127
|
+
after: (context) ->
|
128
|
+
object[methodName] = @originalMethod
|
129
|
+
object.delegateEvents?()
|
130
|
+
|
131
|
+
context.assert @spy.callCount > 0,
|
132
|
+
@spy.printf("expected %n to have been called at least once"),
|
133
|
+
@spy.printf("expected %n to not have been called")
|
134
|
+
|
135
|
+
flag(this, 'whenActions', definedActions)
|
136
|
+
|
119
137
|
)
|
120
138
|
|
139
|
+
|
@@ -53,11 +53,9 @@
|
|
53
53
|
endValue = object()
|
54
54
|
actualDelta = endValue - startValue
|
55
55
|
|
56
|
-
|
57
|
-
result = !result if negate
|
58
|
-
context.assert result,
|
56
|
+
context.assert (@expectedDelta is actualDelta),
|
59
57
|
"expected `#{formatFunction object}` to change by #{@expectedDelta}, but it changed by #{actualDelta}",
|
60
|
-
"not
|
58
|
+
"expected `#{formatFunction object}` not to change by #{@expectedDelta}, but it did"
|
61
59
|
flag(context, 'negate', negate)
|
62
60
|
|
63
61
|
changeToBeginAssert = (context) ->
|
@@ -82,10 +80,9 @@
|
|
82
80
|
endValue = object()
|
83
81
|
|
84
82
|
result = utils.eql(endValue, @expectedEndValue)
|
85
|
-
result = !result if negate
|
86
83
|
context.assert result,
|
87
84
|
"expected `#{formatFunction object}` to change to #{utils.inspect @expectedEndValue}, but it changed to #{utils.inspect endValue}",
|
88
|
-
"not
|
85
|
+
"expected `#{formatFunction object}` not to change to #{utils.inspect @expectedEndValue}, but it did"
|
89
86
|
flag(context, 'negate', negate)
|
90
87
|
|
91
88
|
changeFromBeginAssert = (context) ->
|
@@ -96,10 +93,9 @@
|
|
96
93
|
startValue = object()
|
97
94
|
|
98
95
|
result = utils.eql(startValue, @expectedStartValue)
|
99
|
-
result = !result if negate
|
100
96
|
context.assert result,
|
101
|
-
"expected `#{formatFunction object}` to
|
102
|
-
"not
|
97
|
+
"expected the change of `#{formatFunction object}` to start from #{utils.inspect @expectedStartValue}, but it started from #{utils.inspect startValue}",
|
98
|
+
"expected the change of `#{formatFunction object}` not to start from #{utils.inspect @expectedStartValue}, but it did",
|
103
99
|
flag(context, 'negate', negate)
|
104
100
|
|
105
101
|
changeFromAssert = (context) ->
|
@@ -181,3 +177,4 @@
|
|
181
177
|
|
182
178
|
)
|
183
179
|
|
180
|
+
|
@@ -1,4 +1,3 @@
|
|
1
|
-
#= require ./../chai-backbone
|
2
1
|
|
3
2
|
describe 'Chai-Backbone', ->
|
4
3
|
|
@@ -49,3 +48,31 @@ describe 'Chai-Backbone', ->
|
|
49
48
|
it 'leaves the `to` keyword working properly', ->
|
50
49
|
expect('1').to.be.equal '1'
|
51
50
|
|
51
|
+
describe 'call', ->
|
52
|
+
|
53
|
+
it 'asserts if a method on provided object is called', ->
|
54
|
+
obj =
|
55
|
+
method: ->
|
56
|
+
|
57
|
+
obj.should.call('method').when ->
|
58
|
+
obj.method()
|
59
|
+
|
60
|
+
it 'raises AssertionError if method was not called', ->
|
61
|
+
obj =
|
62
|
+
method: ->
|
63
|
+
expect(->
|
64
|
+
obj.should.call('method').when ->
|
65
|
+
"noop"
|
66
|
+
).to.throw /been called/
|
67
|
+
|
68
|
+
if Backbone? and jQuery?
|
69
|
+
it 'can check event calls of Backbone.Views', ->
|
70
|
+
viewClass = class extends Backbone.View
|
71
|
+
events:
|
72
|
+
'click': 'eventCall'
|
73
|
+
eventCall: ->
|
74
|
+
|
75
|
+
viewInstance = new viewClass
|
76
|
+
viewInstance.should.call('eventCall').when ->
|
77
|
+
viewInstance.$el.trigger('click')
|
78
|
+
|