I'm currently facing some difficulties mocking the 'os' module in NodeJS. I'd like to mock the 'networkInterfaces' function of the module to return a fixed configuration. It is however still returning the interface data of my machines.
I've created a small test case which isolates the problem:
something.ts
:
import * as os from 'os';
export class Something {
getInterfaces(){
return os.networkInterfaces()
}
}
something.spec.ts
:
import * as chai from 'chai';
import * as os from 'os';
import * as sinon from 'sinon';
import sinonChai from 'sinon-chai';
import { Something } from './something';
import { ImportMock } from 'ts-mock-imports';
const expect = chai.expect;
chai.use(sinonChai);
const ip1 = '192.168.1.114';
const mockedInterfaces = {
en0: [
{
address: 'fe80::3e07:54ff:fe66:f0f8',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6' as 'IPv6',
mac: '3c:07:54:66:f0:f8',
scopeid: 4,
internal: false,
cidr: '::1/128'
},
{
address: ip1,
netmask: '255.255.255.0',
family: 'IPv4' as 'IPv4',
mac: '3c:07:54:66:f0:f8',
internal: false,
cidr: '127.0.0.1/8'
}
]
};
describe('Something', () => {
let sandbox: sinon.SinonSandbox;
let something: Something;
let stub: sinon.SinonStub;
before(() => {
sandbox = sinon.createSandbox();
// sandbox.stub(os, 'networkInterfaces').callsFake(() => {
// return mockedInterfaces
// });
stub = ImportMock.mockFunction(os, 'networkInterfaces', mockedInterfaces);
something = new Something();
});
after(() => {
sandbox.restore();
stub.restore();
});
it('Returns the mock', () => {
const interfaces = something.getInterfaces();
expect(interfaces).to.deep.equal(mockedInterfaces);
});
});
Running it yields:
AssertionError: expected { Object (lo, eno2, ...) } to deeply equal { Object (en0) }
<Click to see difference>
at Context.<anonymous> (socket/xml2/something.spec.ts:57:36)
Which means that it is listing my interfaces as opposed to returning the mocked ones.
I'm kind of clueless on how to mock the nodejs module. Any guidance is appreciated.