In trying to test a library function that utilized the fs module, I was given help in this question to better test the functionality, without the mocks, which I agreed with @unional was a better method.
I am trying to do the same with the accessSync method, but it is not working the same way and needs some changes for testing.
My code, following the changes suggested by @unional:
import fs from 'fs';
export function AccessFileSync(PathAndFileName: string):boolean {
if (PathAndFileName === undefined || PathAndFileName === null || PathAndFileName.length === 0) {
throw new Error('Missing File Name');
}
try {
AccessFileSync.fs.accessSync(PathAndFileName, fs.constants.F_OK | fs.constants.R_OK);
} catch {
throw new Error('Cannot Access File');
}
return true;
}
AccessFileSync.fs = fs;
Now, to try to test it, I would:
describe('Return Mock data to test the function', () => {
it('should return the test data', () => {
// mock function
AccessFileSync.fs = {
accessSync: () => { return true; }
} as any;
const AccessAllowed:boolean = AccessFileSync('test-path'); // Does not need to exist due to mock above
expect(AccessFileSync.fs.accessSync).toHaveBeenCalled();
expect(AccessAllowed).toBeTruthy();
});
});
This does work for the first test, but subsequent tests, changing the test, does not get the new value. For instance:
describe('Return Mock data to test the function', () => {
it('should return the test data', () => {
// mock function
AccessFileSync.fs = {
accessSync: () => { return true; }
} as any;
const AccessAllowed:boolean = AccessFileSync('test-path'); // Does not need to exist due to mock above
expect(AccessFileSync.fs.accessSync).toHaveBeenCalled();
expect(AccessAllowed).toBeTruthy();
});
});
describe('Return Mock data to test the function', () => {
it('should return the test data', () => {
// mock function
AccessFileSync.fs = {
accessSync: () => { return false; }
} as any;
const AccessAllowed:boolean = AccessFileSync('test-path'); // Does not need to exist due to mock above
expect(AccessFileSync.fs.accessSync).toHaveBeenCalled();
expect(AccessAllowed).toBeFalsy(); // <- This Fails
});
});
Also, I would like to have the tslint pass, which does not like the as any
layout, and would prefer the Variable:type
notation.
Aucun commentaire:
Enregistrer un commentaire