333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# should.js
 
[![Join the chat at https://gitter.im/shouldjs/should.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/shouldjs/should.js)
 
[![Build Status](https://travis-ci.org/shouldjs/should.js.svg?branch=master)](https://travis-ci.org/shouldjs/should.js)
 
[![Selenium Test Status](https://saucelabs.com/browser-matrix/shouldjs.svg)](https://saucelabs.com/u/shouldjs)
 
_should_ is an expressive, readable, framework-agnostic assertion library. The main goals of this library are __to be expressive__ and __to be helpful__. It keeps your test code clean, and your error messages helpful.
 
By default (when you `require('should')`) _should_ extends the `Object.prototype` with a single non-enumerable getter that allows you to express how that object should behave. It also returns itself when required with `require`.
 
It is also possible to use should.js without getter (it will not even try to extend Object.prototype), just `require('should/as-function')`. Or if you already use version that auto add getter, you can call `.noConflict` function.
 
**Results of `(something).should` getter and `should(something)` in most situations are the same**
 
### Upgrading instructions
 
Please check [wiki page](https://github.com/shouldjs/should.js/wiki/Breaking-changes) for upgrading instructions.
 
### FAQ
 
You can take look in [FAQ](https://github.com/shouldjs/should.js/wiki/FAQ).
 
## Example
```javascript
var should = require('should');
 
var user = {
    name: 'tj'
  , pets: ['tobi', 'loki', 'jane', 'bandit']
};
 
user.should.have.property('name', 'tj');
user.should.have.property('pets').with.lengthOf(4);
 
// If the object was created with Object.create(null)
// then it doesn't inherit `Object.prototype`, so it will not have `.should` getter
// so you can do:
should(user).have.property('name', 'tj');
 
// also you can test in that way for null's
should(null).not.be.ok();
 
someAsyncTask(foo, function(err, result){
  should.not.exist(err);
  should.exist(result);
  result.bar.should.equal(foo);
});
```
## To begin
 
 1. Install it:
 
    ```bash
    $ npm install should --save-dev
    ```
 
 2. Require it and use:
 
    ```js
    var should = require('should');
 
    (5).should.be.exactly(5).and.be.a.Number();
    ```
 
    ```js
    var should = require('should/as-function');
 
    should(10).be.exactly(5).and.be.a.Number();
    ```
 
  3. For TypeScript users:
 
    ```js
    import * as should from 'should';
 
    (0).should.be.Number();
    ```
 
## In browser
 
Well, even when browsers by complaints of authors have 100% es5 support, it does not mean it has no bugs. Please see [wiki](https://github.com/shouldjs/should.js/wiki/Known-Bugs) for known bugs.
 
If you want to use _should_ in browser, use the `should.js` file in the root of this repository, or build it yourself. To build a fresh version:
 
```bash
$ npm install
$ npm run browser
```
 
The script is exported to `window.should`:
 
```js
should(10).be.exactly(10)
```
 
You can easy install it with npm or bower:
 
```sh
npm install should -D
# or
bower install shouldjs/should.js
```
 
## API docs
 
Actual api docs generated by jsdoc comments and available at [http://shouldjs.github.io](http://shouldjs.github.io).
 
## Usage examples
 
Please look on usage in [examples](https://github.com/shouldjs/examples)
 
## .not
 
`.not` negates the current assertion.
 
## .any
 
`.any` allow for assertions with multiple parameters to assert any of the parameters (but not all). This is similar to the native JavaScript [array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some).
 
# Assertions
## chaining assertions
 
Every assertion will return a `should.js`-wrapped Object, so assertions can be chained.
To help chained assertions read more clearly, you can use the following helpers anywhere in your chain: `.an`, `.of`, `.a`, `.and`, `.be`, `.have`, `.with`, `.is`, `.which`. Use them for better readability; they do nothing at all.
For example:
```js
user.should.be.an.instanceOf(Object).and.have.property('name', 'tj');
user.pets.should.be.instanceof(Array).and.have.lengthOf(4);
```
Almost all assertions return the same object - so you can easy chain them. But some (eg: `.length` and `.property`) move the assertion object to a property value, so be careful.
 
## Adding own assertions
 
Adding own assertion is pretty easy. You need to call `should.Assertion.add` function. It accept 2 arguments:
 
1. name of assertion method (string)
2. assertion function (function)
 
What assertion function should do. It should check only positive case. `should` will handle `.not` itself.
`this` in assertion function will be instance of `should.Assertion` and you **must** define in any way this.params object
 in your assertion function call before assertion check happen.
 
`params` object can contain several fields:
 
- `operator` - it is string which describe your assertion
- `actual` it is actual value, you can assume it is your own this.obj if you need to define you own
- `expected` it is any value that expected to be matched this.obj
 
You can assume its usage in generating AssertionError message like: expected `obj`? || this.obj not? `operator` `expected`?
 
In `should` sources appeared 2 kinds of usage of this method.
 
First not preferred and used **only** for shortcuts to other assertions, e.g how `.should.be.true()` defined:
 
```javascript
Assertion.add('true', function() {
    this.is.exactly(true);
});
```
There you can see that assertion function do not define own `this.params` and instead call within the same assertion `.exactly`
that will fill `this.params`. **You should use this way very carefully, but you can use it**.
 
Second way preferred and i assume you will use it instead of first.
 
```javascript
Assertion.add('true', function() {
    this.params = { operator: 'to be true', expected: true };
 
    should(this.obj).be.exactly(true);
});
```
in this case this.params defined and then used new assertion context (because called `.should`). Internally this way does not
 create any edge cases as first.
 
```javascript
Assertion.add('asset', function() {
    this.params = { operator: 'to be asset' };
 
    this.obj.should.have.property('id').which.is.a.Number();
    this.obj.should.have.property('path');
})
 
//then
> ({ id: '10' }).should.be.an.asset();
AssertionError: expected { id: '10' } to be asset
    expected '10' to be a number
 
> ({ id: 10 }).should.be.an.asset();
AssertionError: expected { id: 10 } to be asset
    expected { id: 10 } to have property path
```
 
## Additional projects
 
* [`should-sinon`](https://github.com/shouldjs/sinon) - adds additional assertions for sinon.js
* [`should-immutable`](https://github.com/shouldjs/should-immutable) - extends different parts of should.js to make immutable.js first-class citizen in should.js
* [`should-http`](https://github.com/shouldjs/http) - adds small assertions for assertion on http responses for node only
* [`should-jq`](https://github.com/shouldjs/jq) - assertions for jq (need maintainer)
* [`karma-should`](https://github.com/seegno/karma-should) - make more or less easy to work karma with should.js
* [`should-spies`](https://github.com/shouldjs/spies) - small and dirty simple zero dependencies spies
 
 
## Contributions
 
[Actual list of contributors](https://github.com/visionmedia/should.js/graphs/contributors) if you want to show it your friends.
 
To run the tests for _should_ simply run:
 
    $ npm test
 
See also [CONTRIBUTING](./CONTRIBUTING.md).
 
## OMG IT EXTENDS OBJECT???!?!@
 
Yes, yes it does, with a single getter _should_, and no it won't break your code, because it does this **properly** with a non-enumerable property.
 
Also it is possible use it without extension. Just use `require('should/as-function')` everywhere.
 
## License
 
MIT. See LICENSE for details.