2015-12-05 7 views
2

Я пытаюсь заглушить функцию контроллера парусов, но я не знаю, какой объект для заглушки. использованием sinon.stub(object,'funcname', function()...sails.js + mocha + supertest + sinon: как отключить функцию управления sails.js

Это, вероятно, связано с тем, как парусами связать функции контроллера ...

Вот код, чтобы дать пример

файл API контроллера/контроллеры/PersonController.js

var fs = require('fs'); 

// 
// I want to stub retrieveData function when testing 
// 
function retreiveData(cb) { 
    fs.readFile('./filedata', function (err, data) { 
     if (err) throw err; 
     cb(data.toString()); 
    }); 
}; 
function showdata(req, res) { 
    var stack = new Error().stack 
    console.log(stack) 

    retreiveData(function (data) { 
     res.send(data); 
    }); 
}; 
module.exports = { 
    showdata: showdata, 
    retreiveData: retreiveData 
}; 

Тестовый файл:

var request = require('supertest'); 
var sinon = require('sinon'); 
describe('GET /person/showdata', function() { 
    it('should return person show data', function(done) { 
     // 
     // here is the stub function I want to create 
     // 
     stub = sinon.stub(sails.middleware.controllers.person, 'retreivedata', function(cb) { 
      cb("Some stub data"); 
     }); 
     request(server) 
      .get('/person/showdata') 
      .expect(200) 
      .expect(/Some stub data/) 
      .end(function(err, res) { 
       if (err) 
        throw err; 
       done(); 
      }); 
    }); 
}); 

загрузочный файл: тест/bootstarp.test.js

var Sails = require('sails'), sails; 
var _ = require('lodash'); 
before(function(done) { 
    Sails.lift({ 
    // configuration for testing purposes 
    }, function(err, s) { 
    if (err) return done(err); 
    sails = s; 
    global.server = sails.hooks.http.app; 
    // here you can load fixtures, etc. 
    done(err, sails); 
    }); 
}); 
after(function(done) { 
    // here you can clear fixtures, etc. 
    sails.lower(done); 
}); 

Я бегу тест с:

NODE_ENV=test mocha test/bootstrap.test.js test/api/**/*.js 

и получите:

TypeError: Attempted to wrap object property retreivedata as function 
+0

Возможный дубликат [гася методом класса с Sinon.js] (http://stackoverflow.com/questions/21072016/stubbing-a-class- method-with-sinon-js) – m90

ответ

1

Вот одно из возможных решений.

  • Контроллер вызова функции из ctrlFunc объекта

    var ctrlFunc = { 
        retreiveData: retreiveData, 
    }; 
    function showdata(req, res) { 
         ctrlFunc.retreiveData(function (data) { 
         res.send(data); 
        }); 
    }; 
    
  • контроллера нужно экспортировать ctrlFunc объект во время теста (sinon.stub необходим доступ к ctrlFunc)

    /* 
        Only add extra exports during test 
        this allow sinon.stub to retreive object during test 
    */ 
    
    if (process.env.NODE_ENV === 'test') { 
        module.exports.ctrlFunc = ctrlFunc; 
    } 
    
  • тестовый файл требует PersonController, затем метод заглушки на PersonController. ctrlFunc объект

    var PersonCtrl = require('../../../api/controllers/PersonController'); 
        stub = sinon.stub(PersonCtrl.ctrlFunc, 'retreiveData', function(cb) { 
         console.log('into stub function'); 
         cb("Some stub data"); 
        }); 
    

размещая все вместе мы имеем сейчас:

  • файл контроллера

    // File: api/controllers/PersonController.js 
    var fs = require('fs'); 
    var ctrlFunc = { 
        retreiveData: retreiveData, 
    }; 
    function retreiveData (cb) { 
        fs.readFile('./filedata', function (err, data) { 
         if (err) throw err; 
         cb(data.toString()); 
        }); 
    }; 
    
    function showdata(req, res) { 
         ctrlFunc.retreiveData(function (data) { 
         res.send(data); 
        }); 
    }; 
    
    module.exports = { 
        showdata: showdata, 
    }; 
    
    /* 
        Only add extra exports during test 
        this allow sinon.stub to retreive object during test 
    */ 
    
    if (process.env.NODE_ENV === 'test') { 
        module.exports.ctrlFunc = ctrlFunc; 
    } 
    
  • тестовый файл:

    // test/api/controllers/PersonController.test.js 
    var request = require('supertest'); 
    var sinon = require('sinon'); 
    
    describe('GET /person/showdata', function() { 
        var stub; 
        before(function() { 
         var PersonCtrl = require('../../../api/controllers/PersonController'); 
         stub = sinon.stub(PersonCtrl.ctrlFunc, 'retreiveData', function(cb) { 
          console.log('into stub function'); 
          cb("Some stub data"); 
         }); 
    
        }); 
        after(function() { 
         stub.restore(); 
        }); 
        it('should return person show data', function(done) { 
         request(server) 
          .get('/person/showdata') 
          .expect(200) 
          .expect(/Some stub data/) 
          .end(function(err, res) { 
           if (err) 
            throw err; 
           done(); 
          }); 
        }); 
    }); 
    
  • испытание теперь преуспевающий

    NODE_ENV=test mocha test/bootstrap.test.js test/api/controllers/PersonController.test.js 
        GET /person/showdata 
        into stub function 
         ✓ should return person show data (62ms) 
         1 passing (2s) 
    
+0

Спасибо, что поделились этим. Вы должны принять свой собственный ответ.Очень жаль, что нет модуля, который делает это уже. –

Смежные вопросы