Sinon STUB работает в тестовом файле, но не в реальном кодовом файле - PullRequest
0 голосов
/ 27 апреля 2019

Я создал sinon STUB, который заглушки ("password-hash": "^ 1.2.2") метод генерации PasswordHash.Здесь происходит, когда я запускаю метод PasswordHash.generate ('mnop') в файле TEST, он работает.Но когда метод PasswordHash.generate вызывается в реальном коде, он не работает, и оригинальный метод PasswordHash.generate вызывается вместо вызова заглушенного.

import * as sinon from 'sinon'
import UserDetails from '../../src/model/UserDetails';
import * as ClassValidator from "class-validator";
import * as PasswordHash from 'password-hash';

let sandbox: sinon.SinonSandbox;

describe('Model > LoginUserDetails', () => {
    let userDetailsLetralObject = {
        email: 'zia@g.com',
        password: 'Savanur1',
        roles: ['lecturer'],
        departments: ['ec']
    };
    const userDetails = new UserDetails(userDetailsLetralObject.email,
        userDetailsLetralObject.password,
        userDetailsLetralObject.roles,
        userDetailsLetralObject.departments,
        false
    );
    beforeEach(() => {
        sandbox = sinon.createSandbox();
    });
    afterEach(() => {
        sandbox.restore();
    });

    describe('constructor testing...', () => {
        test('With password hash', async (done) => {
            const passwordHashStub = sandbox.stub(PasswordHash, 'generate').returns('hashedPassword')
            console.log(PasswordHash.generate('mnop'))
            // Here it prints string 'hashedPassword' i.e returned buy passwordHashStub method            
            let userDeatilsObj = await new UserDetails(
                userDetailsLetralObject.email,
                userDetailsLetralObject.password,
                userDetailsLetralObject.roles,
                userDetailsLetralObject.departments,
                true);
            expect(passwordHashStub.withArgs(userDetailsLetralObject.password).calledOnce).toBeTruthy()
            // This will check for not equal
            expect(userDeatilsObj).not.toEqual(userDetails)
            expect(userDeatilsObj.validatePassword('hashedPassword')).toBeTruthy()
            done();
        });
    });
});
import * as PasswordHash from 'password-hash'

class UserDetails {

    constructor(email: String, password: String, roles: String[], departments: String[], hashPassword: Boolean) {
        this.email = email
        /*  In this console.log it will call the original PasswordHash.generate method 
         *  instead of called stubbed one (means it will print big hashed password)
         */
        console.log(PasswordHash.generate('mnop')
        this.password = hashPassword ? PasswordHash.generate(password.toString()) : password
        this.roles = roles
        this.departments = departments
    }
    validatePassword(password: String): Boolean {
        // return PasswordHash.verify(password.toString(), this.password.toString());
        return password.toString() === this.password.toString();
    }

}
export default UserDetails
...