referee icon indicating copy to clipboard operation
referee copied to clipboard

referee.exception doesn't test for exact match of exception properties

Open gukoff opened this issue 1 year ago • 1 comments

We understand you have a problem and are in a hurry, but please provide us with some info to make it much more likely for your issue to be understood, worked on and resolved quickly.

  • library version : 10.0.0
  • Environment : OSX
  • Other libraries you are using: sinon

How to reproduce

assert.exception(
    function () {
        throw new TypeError('long exception message');
    },
    {
        message: "message",
        name: "rr",
    }
);

What did you expect to happen?

Test fails

What actually happens

Test succeeds

Reason

When samsam library detects there's no match, referee tries to verify that by iterating property-by-property and comparing again: https://github.com/sinonjs/referee/blob/main/lib/assertions/exception.js#L52

The problem is, comparing objects is different from comparing strings in samsam.

When iterating property-by-property, we don't check for string equality, rather that one string is a substring of anoter: https://github.com/sinonjs/samsam/blob/main/lib/match.js#L71-L74

This makes the check in assert.exception weaker - it succeeds if the strings in the matcher strings are just the substrings of the corresponding properties.

I would expect this behaviour to be either changed or explicitly documented.

gukoff avatar Aug 14 '23 11:08 gukoff

I agree with this and I ran into the same issue myself. My preference would be to change the current behaviour and release a major. If someone wants the current behaviour, they can wrap the expectation like match({ ... }), so it's quite easy to migrate.

Would you be able to send a pull request for this?

mantoni avatar Aug 15 '23 13:08 mantoni