Releases: chaijs/chai
4.3.2 / 2021-03-03
4.3.1 / 2021-03-02
This releases fixed an engine incompatibility with 4.3.0
The 4.x.x series of releases will be compatible with Node 4.0. Please report any errors found in Node 4 as bugs, and they will be fixed.
The 5.x.x series, when released, will drop support for Node 4.0
This fix also ensures pathval
is updated to 1.1.1
to fix CVE-2020-7751
4.3.0 / 2021-02-04
This is a minor release.
Not many changes have got in since the last release but this one contains a very important change (#1257) which will allow jest
users to get better diffs. From this release onwards, jest
users will be able to see which operator was used in their diffs. The operator
is a property of the AssertionError
thrown when assertions fail. This flag indicates what kind of comparison was made.
This is also an important change for plugin maintainers. Plugin maintainers will now have access to the operator
flag, which they can have access to through an
utilmethod called
getOperator`.
Thanks to all the amazing people that contributed to this release.
New Features
- Allow
contain.oneOf
to take an array of possible values (@voliva) - Adding operator attribute to assertion error (#1257) (@rpgeeganage)
- The
closeTo
error message will now inform the user when adelta
is required (@eouw0o83hf)
Docs
- Add contains flag to oneOf documentation (@voliva)
Tests
- Make sure that
useProxy
config is checked inoverwriteProperty
(@vieiralucas) - Add tests for
contain.oneOf
(@voliva )
Chores
- Update mocha to version 6.1.4
- Add node v10 and v12 to ci (@vieiralucas)
- Drop support for node v4, v6 and v9 (@vieiralucas)
- Fix sauce config for headless chrome (@meeber)
- Update dev dependencies (@meeber)
- Removed phantomjs dependency (#1204)
4.2.0 / 2018-09-25
This is a minor release. Thank you to all of our contributors and users!
New Features
- feat(assertions): add 'still' language chain (#1194; @ScottRudiger)
- .lengthOf for Maps and Sets (#1110, #1131; @asbish)
- feat: Add the assert.fail([message]) interface (#1116, #1117; @s-leroux)
Bug Fixes
- fix: remove Chai frames from
.deep.equal
stack (#1124; @meeber) - add 'catch' keyword to proxyExcludedKeys (#1050, #1101; @generalandrew)
- property assertion should only accept strings if nested (#1043, #1044; @solodynamo)
- fix: Make tests pass with
--use_strict
(#1034, #1040; @shvaikalesh)
Performance
- perf: Optimize proxify and stringDistance (#1098; @sophiebits)
- fix: Avoid repeated String#slice calls in stringDistance (#1095; @bmeurer)
Style
- Fix typos and remove trailing whitespaces (#1042; @simonewebdesign)
- Remove unnecessary code (#1049; @abetomo)
- Fix variable declaration (#1048; @abetomo)
Tests
- test(assert): increase coverage (#1084, #1085; @brutalcrozt)
- test: stop modifying globals in Proxy tests (#1144; @meeber)
Docs
- Fix unbalanced quotes in assert.notInclude example (#1200; @haykam821)
- docs: fix bad
.string
example (#1156, #1157; @meeber) - fixed package npm url (#1151; @wadie)
- Spelling (#1145; @jsoref)
- docs: corrected spelling (#1141; @Powell-v2)
- docs: fix wrong
.property
chaining examples (#193 (comment), #1130; @meeber) - docs: improve throws examples (#1113; @ColinEberhardt)
- Fix typos (#1107; @tbroadley)
- docs: correct
.ok
description (#1047; @shvaikalesh)
Chores
- chore: update package-lock.json (#1198; @meeber)
- Update mocha to the latest version (#1127)
- chore: update dependencies (#1157; @meeber)
- Update browserify to the latest version (#1135)
- chore: update Node versions in Travis config (#1126; @meeber)
- chore: remove Opera from Sauce config (#1125; @meeber)
- chore: update dependencies (#1118; @meeber)
- chore: update dependencies (#1074; @meeber)
- Chore: change coverage service (coverall to codecov) (#927, #1073; @brutalcrozt)
- chore: add package-lock.json (#1013; @meeber)
4.1.2 / 2017-08-31
4.1.1 / 2017-08-05
This release includes a few bug and documentation fixes.
Bug Fixes
- fix:
.instanceof
to allow DOM interfaces in IE11 (#1000, #1008; @meeber) - fix:
.include
to work with all objects (#1009, #1012; @meeber)
Docs
- fix: correct hasAnyKeys comment error (#1014; @zenHeart)
- docs: re-indent hasAnyKeys code (#1016; @keithamus)
4.1.0 / 2017-07-11
This release includes one new feature and a few bug fixes.
New Features
- Add ES6 collection support to include() (#970, #994; @shvaikalesh)
Bug Fixes
- Allow dates for isBelow and isAbove assertions (#980, #990; @v1adko)
- fix: check target's type in
.property
assertion (#992; @meeber)
Chores
- Add a missing var keyword found by lgtm.com (#988; @samlanning)
- refactor:
expectTypes
to accessssfi
flag (#993; @meeber) - Create CODEOWNERS (#1004; @keithamus)
4.0.2 / 2017-06-05
We have another bugfix release, addressing some issues for WebPack 1 users.
Bug Fixes
4.0.1 / 2017-05-31
4.0.1
Of course, any major release cannot go without a quick bugfix release shortly after - and here's ours!
Bug Fixes
4.0.0 / 2017-05-26
4.0.0
4.0 has been a huge undertaking by the chai community! A lot has changed to ensure Chai 4 is a stable, reliable, well documented codebase. Here are just some of the major improvements:
-
almost all documentation has been rewritten, with detailed instructions on how assertions work, which flags they can be combined with and the best practices for how to use them.
-
deep equality has been rewritten from the ground up to support ES6 types like
Map
andSet
, and better support existing types. It is now also much, much faster than before and allows us to bring some great improvements in upcoming releases. -
we have made sure the
deep
flag now only ever does deep equality. Beforehand, it would sometimes also be used to test nested properties (for exampleexpect(foo).to.have.deep.property('bar.baz')
. For nested assertions, please now use the.nested
flag. -
many assertions have become more strict, which means you get better error messages explaining where things have gone wrong. For the most part, this wont mean error messages where there weren't error messages before, but it will mean better error messages to replace the, sometimes cryptic, default
TypeError
messages. -
we've added detections and helpful error messages for common mistakes and typos. The error messages will, in some cases, point you to documentation or in other cases suggest alternatives. These messages will continue to be improved in future releases, so let us know if you have any suggestions!
Breaking Changes
-
We no longer support Node v0.10 and v0.12 (since their LTS has ended) (PRs: #816, #901)
-
Instead of allowing the user to write the path of a property, now the deep flag performs a deep equality comparison when used with the
.property
assertion.
If you want the old behavior of using the dot or bracket notation to denote the property you want to assert against you can use the new.nested
flag. (Related Issues: #745, #743, PRs: #758, #757)const obj = {a: 1}; // The `.deep` flag now does deep equality comparisons expect({foo: obj}).to.have.deep.property('foo', {a: 1}); // Use the `nested` flag if you want to assert against a nested property using the bracket or dot notation expect({foo: obj}).to.have.nested.property('foo.a', 1); // You can also use both flags combined const obj2 = {a: {b: 2}}; expect({foo: obj2}).to.have.deep.nested.property('foo.a', {b: 2});
Please notice that the old methods which used the old behavior of the
deep
flag on theassert
interface have been renamed. They all have had thedeep
word changed by thenested
word. If you want to know more about this please take a look at #757. -
Previously,
expect(obj).not.property(name, val)
would throw an Error ifobj
didn't have a property namedname
. This change causes the assertion to pass instead.
Theassert.propertyNotVal
andassert.deepPropertyNotVal
assertions were renamed toassert.notPropertyVal
andassert.notDeepPropertyVal
, respectively. (Related Issues: #16, #743, #758) -
You can now use the
deep
flag for the.include
assertion in order to perform adeep
equality check to see if something is included on thetarget
.
Previously,.include
was using strict equality (===
) for non-negated property inclusion, butdeep
equality for negated property inclusion and array inclusion.
This change causes the .include assertion to always use strict equality unless the deep flag is set.
Please take a look at this comment if you want to know more about it. (Related Issues: #743, PRs: #760, #761)const obj = {a: 1}; expect([obj]).to.deep.include({a:1}); expect({foo: obj}).to.deep.include({foo: {a:1}});
-
Fix unstable behavior of the
NaN
assertion. Now we use the suggested ES6 implementation.
The new implementation is now more correct, strict and simple. While the old one threw false positives, the new implementation only checks if something isNaN
(or not if the.not
flag is used) and nothing else. (Related Issues: #498, #682, #681, PRs: #508)// Only `NaN` will be considered to be `NaN` and nothing else expect(NaN).to.be.NaN; // Anything that is not `NaN` cannot be considered as `NaN` expect('randomString').not.to.be.NaN; expect(true).not.to.be.NaN; expect({}).not.to.be.NaN; expect(4).not.to.be.NaN;
-
The Typed Array types are now truncated if they're too long (in this case, if they exceed the
truncateThreshold
value on theconfig
). (Related Issues: #441, PRs: #576)var arr = []; for (var i = 1; i <= 1000; i++) { arr.push(i); } // The assertion below will truncate the diff shown and the enormous typed array will be shown as: // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... ] instead of printing the whole typed array chai.expect(new Float32Array(100)).to.equal(1);
-
The assertions:
within
,above
,least
,below
,most
,increase
,decrease
will throw an error if the assertion's target or arguments are not numbers. (Related Issues: #691, PRs: #692, #796)// These will throw errors, for example: expect(null).to.be.within(0, 1); expect(null).to.be.above(10); expect(null).to.be.at.least(20); expect(null).to.be.below(20); expect(null).to.be.at.most(20); expect(null).to.increase.by(20); expect(null).to.decrease.by(20); // This will not: expect('string').to.have.a.lengthOf.at.least(3);
-
Previously,
expect(obj).not.ownProperty(name, val)
would throw an Error if obj didn't have an own property (non-inherited) named name. This change causes the assertion to pass instead. (Related Issues: #795, #, PRs: #744, #810)*expect({ foo: 'baz' }).to.not.have.own.property('quux', 'baz');
-
The
.empty
assertion will now throw when it is passed non-string primitives and functions (PRs: #763, #812)// These will throw TypeErrors: expect(Symbol()).to.be.empty; expect(function() {}).to.be.empty; expect(true).to.be.empty; expect(1).to.be.empty
-
Assertion subject (
obj
) changes when usingownProperty
orown.property
and thus enables chaining. (Related Issues: #281, PRs: #641)expect({val: 20}).to.have.own.property('val').above(10);
-
The
.change
,.increase
, and.decrease
assertions changed from chainable method assertions to method assertions. They don't have any chaining behavior, and there's no generic semantic benefit to chaining them. (Related Issues: #917, PRs: #925)
// This will not work anymore because there is no benefit to chaining these assertions:
expect(function() {}).to.change.by(2)
expect(function() {}).to.increase.by(2)
expect(function() {}).to.decrease.by(2)
-
The
utils
(second argument passed to thechai.use
callback function) no longer exports thegetPathValue
function. If you want to use that please use thepathval
module, which is what chai uses internally now. (Related Issues: #457, #737, PRs: #830) -
(For plugin authors) Throw when calling
_super
onoverwriteMethod
if the method being overwritten isundefined
.
Currently if the method you are trying to overwrite is not defined and your new method calls_super
it will throw anError
.(Related Issues: #467, PRs: #528)
Before this change, calling_super
would simply returnthis
.// Considering the method `imaginaryMethod` does not exist, this would throw an error for example: chai.use(function (chai, utilities) { chai.Assertion.overwriteMethod('imaginaryMethod', function (_super) { return function () { _super.apply(this, arguments); } }); }); // This will throw an error since you are calling `_super` which should be a method (in this case, the overwritten assertion) that does not exist expect('anything').to.imaginaryMethod();
-
(For plugin authors) Now
showDiff
is turned on by default whenever theshowDiff
flag is anything other thanfalse
.
This issue will mostly affect plugin creators or anyone that made extensions to the core, since this affects theAssertion.assert
method. (Related Issues: #574, PRs: #515)// Now whenever you call `Assertion.assert` with anything that is not false for the `showDiff` flag it will be true // The assertion error that was thrown will have the `showDiff` flag turned on since it was not passed to the `assert` method try { new chai.Assertion().assert( 'one' === 'two' , 'expected #{this} to equal #{exp}' , 'expected #{this} to not equal #{act}' , 'one' , 'two' ); } catch(e) { assert.isTrue(e.showDiff); } // The assertion error that was thrown will have the `showDiff` flag turned off since here we passed `false` explicitly try { new chai.Assertion().assert( 'one' === 'two' , 'expected #{this} to equal #{exp}' , 'expected #{this} to not equal #{act}' , 'one' , 'two' , false ); } catch(e) { assert.isFalse(e.showDiff); }
New Features
-
Throw when non-existent property is read. (Related Issues: #407, #766 PRs: #721, #770)
This is a potentially breaking change. Your build will fail if you have typos in your property assertions
Before4.x.x
when using property assertions they would not throw an error if you wrote it incorrectly.
The example below, for example, would pass:expect(true).to.be.ture; // Oops, typo, now Chai will throw an Error
Since this implementation depends on ES6
Proxies
it will only work on platforms that support it.**This property can be enabled (default) or disable...