224 lines
7.6 KiB
Markdown
224 lines
7.6 KiB
Markdown
|
# should.js
|
||
|
|
||
|
[](https://gitter.im/shouldjs/should.js)
|
||
|
|
||
|
[](https://travis-ci.org/shouldjs/should.js)
|
||
|
|
||
|
[](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.
|