jeudi 25 octobre 2018

JavaScript Throw Error - No error thrown? Mocha testing issue

I am working on a JavaScript project and am struggling to pass the final unit test, which essentially checks if my function throws an error if the given input is invalid. For some background, it is a function which deals with user permissions, and can check if certain permissions can be granted or denied, given certain prerequisites.

I can pass all the tests with regards to the output of the functions, but am having trouble with error handling. I am being told that I am not throwing an error, despite checking myself multiple times that an error is indeed being thrown. I'll attach images to illustrate the issue as best as possible.

First, the error object which I am trying to throw is defined below:

function InvalidBasePermissionsError() {
    this.name = 'InvalidBasePermissionsError';
    this.message = "Invalid Base Permissions";
    this.stack = Error().stack;
}

InvalidBasePermissionsError.prototype = Object.create(Error.prototype);

My function which is failing the error-throwing test is as follows:

PermissionDependencyResolver.prototype.canDeny = function (existing, permToDeny) {
    try {
        if (!pdr.checkValid(existing)) {
            throw new InvalidBasePermissionsError;
        }
        else {
            var tempArr = existing
            var required = [];
            for (var i = 0; i < tempArr.length; i++) {
                var current_dependency = this.adjList[existing[i]];
                required.push.apply(required, current_dependency)
            };
            if (required.includes(permToDeny)) {
                return false;
            } else {
                return true;
            }
        }
    }
    catch (e) {
        console.log(e.message)
    }

};

The strange thing is that when I console log the function as follows:

 pdr.canDeny(['create', "delete"], 'audit')

I get the correct string "Invalid Base Permissions" printed to the console, see image1. What is even more strange is that when I run the tests, I can see this same error message being logged directly above the "failed test" message, which seems contradictory, see image 2. Is it possible that Mocha (the test framework) isn't picking up on my error handling; or have I made a mistake in my function and am not throwing the error appropriately?

The tests in question are as follows:

  it('throws an exception when validating permissions if existing permissions are invalid', function(){
    pdr = new PermissionDependencyResolver(complexPermissionDependencies)

    expect(function () { pdr.canGrant(['edit', 'create'], 'alter_tags') }).toThrowError("Invalid Base Permissions")
    expect(function () { pdr.canGrant(['view', 'delete'], 'alter_tags') }).toThrowError("Invalid Base Permissions")
    expect(function () { pdr.canDeny(['create', 'delete'], 'audit') }).toThrowError("Invalid Base Permissions")
  })

Is it possible that Mocha (the test framework) isn't picking up on my error handling; or have I made a mistake in my function and am not throwing the error appropriately?

Again, when I manually console log each of the cases being tested, they all throw the error message "Invalid Base Permissions" as expected. For some reason, however, the tests are telling me that nothing is being thrown.

Any ideas as to what might be causing this would be a massive help, as I'm at a loss as to what the source of the error is. Is it Mocha, JS, my try/catch syntax or some other issue. Any help is really appreciated.

Thanks!

Aucun commentaire:

Enregistrer un commentaire