lepp
lepp

Reputation: 13

Mocha/chai assertion is failing but there is no diff

I'm creating a binary tree class in javascript and my test is failing but I don't see anything wrong with my method and I'm not receiving any diff. Any insight would be awesome.

Here's my class:

    function binaryTree() {
      this.root = null;
    };
    binaryTree.prototype = {
    constructor: binaryTree,
    add: function(val) {
        var root = this.root;
        if(!root) {
          this.root = new Node(val);
          return;
        }
        var currentNode = root;
        var newNode = new Node(val);
        while(currentNode) {
          if(val < currentNode.value) {
            if(!currentNode.left) {
              currentNode.left = newNode;
              break;
            }
            else {
              currentNode = currentNode.left;
            }
          }
          else {
            if(!currentNode.right) {
              currentNode.right = newNode;
              break;
            }
            else {
              currentNode = currentNode.right;
            }
          }
        }
      }

Here's my test:

it('adds values to the binary tree', function () {
  var test = new binaryTree();
  test.add(7);
  test.add(43);
  test.add(13);
  test.add(27);
  test.add(82);
  test.add(2);
  test.add(19);
  test.add(8);
  test.add(1);
  test.add(92);

  expect(test).to.equal({
    root:
     { value: 7,
       left:
        { value: 2,
          left: { value: 1, left: null, right: null },
          right: null },
       right:
        { value: 43,
          left:
           { value: 13,
             left: { value: 8, left: null, right: null },
             right:
              { value: 27,
                left: { value: 19, left: null, right: null },
                right: null } },
          right:
           { value: 82,
             left: null,
             right: { value: 92, left: null, right: null } } } }
  });
});

And here is the error I'm getting:

1) binary tree tests adds values to the binary tree:

    AssertionError: expected { Object (root) } to equal { Object (root) }
    + expected - actual

If I mess around with the values in the test object I see a diff appear so it looks to me like everything is equal and I'm stumped. I'd really appreciate it if I could get a second pair of eyes on this.

Upvotes: 1

Views: 1477

Answers (2)

lepp
lepp

Reputation: 13

In case anyone comes across this I found the issue. Two objects cannot be perfectly compared in JavaScript even if all of the properties are equal. This post has two methods to work around this limitation, one of which was very easy to implement in this case:

Changing expect(test).to.equal({ to expect(JSON.stringify(test)).to.equal(JSON.stringify({ will allow this test to pass. Stringifying the objects is a very easy way to compare two objects but this will only work if the properties are in the exact same order.

Upvotes: 0

CJ Apel
CJ Apel

Reputation: 99

You are using Mocha's to.equal expectation, but that tests for strict equality. http://chaijs.com/api/bdd/#method_equal

Two objects, even if they have all the same key-value pairs, will not return true to a triple-equals (===) comparator. This is because they really are two separate objects stored in memory that happen to look alike.

Use to.deep.equal instead!

Make sense?

Upvotes: 2

Related Questions