Как смоделировать или заглушить стороннее свойство зависимости в вашем контроллере API с помощью sinon? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть функция, которая вызывается в моем контроллере API, которая вызывает унаследованное свойство из класса.Как я могу издеваться над этим унаследованным свойством, чтобы оно выполняло свое поведение, но не обязательно подключается к сети / базе данных, где выполняется инициализация?Я пытался использовать насмешку, но она не ведет себя так, как я ожидаю.

PS Я спрашиваю об этом, так как пока не знаю, как создать тестовый сценарий с использованием sinon-chai.

Это то, что я пробовал до сих пор:


//test-process.js

const sinon = require('sinon');
const chai = require('chai');
const expect = chai.expect;
const should = chai.should();
const mockery = require('mockery');
chai.use(require('chai-as-promised'));
const obj = require('./data/test-process-data');
let sandbox,req;

describe('Test process controller') ()=>{
    beforeEach(()=>{
        sandbox = sinon.createSandbox();
        req ={
            body: obj.body.data,
        };

        const mockingFunc = require('./callFunc'); 
        mockery.registerMock('./callFunc', mockingFunc);

        sinon.mock(mockingFunc, 'getDefaultFunc');
    })

    afterEach(() => {
        sandbox.restore();
    })

     describe('Test Create Transaction', () => {

        it('should create new transaction', async () => {
            const res = await chai.request(url).post('/api/process').send(req.body);
            should.exist(res.body);
            res.body.should.be.a('object');
            res.should.have.status(200);
            res.body.should.have.property('message').eql('Successfully saved transaction Data.');
            done();
        });

    });
}

Вот мои функции и коды контроллера:


//mymainfunc.js

const processFunc = require('processFunc');

class mainFunc{
    constructor(name,address,phoneNumber){
        this.name = name;
        this.address = address;
        this.phoneNumber = phoneNumber;
    }

    init(options){
        this.conOptions = options;
    } 

    async processData(funcName,params){
        const runProcess = await processFunc.createTransaction(funcName,params);
        return runProcess;
    }
}
module.exports = mainFunc;


//callFunc.js

const mainFunc = require('mymainfunc');
const callFunc = {};
let defaultFunc;
const fullname="Alix";
const address = "Colorado";
const contactNumber = "303-555-01234";
//this is being called in server.js
callFunc.init() = async (dbConfig,netConfig){
    try{
    ....
        defaultFunc = new mainFunc(fullname,address,contactNumber);
        defaultFunc.init(netConfig);
    }catch(err){
        throw new Error('process error: ' + err);
    }
}
callFunc.getDefaultFunc = () => {
    return defaultFunc;
};

module.exports = callFunc;


//process api controller

const callFunc = require('./callFunc');
const process = {};
process.create= asyc(req,res){
    const transactionData= {
        orderId: req.body.orderId,
        items:req.body.items
    }
    try{
        const submitData = await callFunc.getDefaultFunc().processData('createTransaction',transactionData);

        res.json({ statusCode: 200, success: true, data: JSON.parse(submitData.toString())});

    }catch(err){
        res.json({ statusCode: 500, data: {}, message: "Transaction Error!" });
    }
};

module.exports = process;

...