2017-01-16 68 views
0

我正在为我的电子js应用程序编写单元测试,而且我被困在一个地方。如何在电子模拟需求js

例如

比方说我的应用程序代码是像下面

var app= (function() { 
    function app() { 
     var _this = this; 
     this.open = function (data) { 
      var deferred = Q.defer(); 
      try { 
       // some code 
      } 
      catch (ex) { 
       deferred.reject(ex); 
      } 
      return deferred.promise; 
     }; 

    } 
}()); 
exports.app = app 

现在,如果我想电子客户端上运行它,它将会运行完美的罚款作为电子模块安装客户端的PC上

问题是,当我试图编写上述单元测试用例,因为在下面的开发机器上没有安装电子设备

import { app} from '../../app' 
    import { Rights } from '../../Rights' 
    describe('app',() => { 
     let app: app; 
     beforeEach(() => { 
      app= new app(); 
     }) 

     it('should call open() and return error for null content', function (done) { 
      let output = app.open(null); 
      output 
      .then((res) => { 
       //expectation 
       done(); 
      }) 
      .catch((err)=>{ 
       //expectation 
       done(); 
      }) 
     }) 
    }) 

获得以下错误

Error: Cannot find module 'electron'                                      
    at Function.Module._resolveFilename (module.js:469:15)                                 
    at Function.Module._load (module.js:417:25)                                   
    at Module.require (module.js:497:17)                                     
    at require (internal/module.js:20:19)                                     
    at Object.<anonymous> (<project pat>/app.js:2:16)                  
    at Module._compile (module.js:570:32)                                     
    at Object.Module._extensions..js (module.js:579:10)                                 
    at Module.load (module.js:487:32)                                      
    at tryModuleLoad (module.js:446:12)                                     
    at Function.Module._load (module.js:438:3)                                    
npm ERR! Test failed. See above for more details. 

问题

  • 如何嘲笑要求对未安装dev的PC 上,但实际执行所需的任何模块(安装在客户的电脑上) 。

回答

0

您可以通过覆盖module._load拦截require电话:

const m = require('module'); 
const originalLoader = m._load; 
const stubs = { electron : {} }; 

m._load = function hookedLoader(request, parent, isMain) { 
    const stub = stubs[request]; 
    return stub || originalLoader(request, parent, isMain); 
}; 
+0

用一些小的变化你的解决方案.. :) –

0

我有过类似的问题与摩卡。我的基本方法是: *需要电子在前面的勾, *与本地默认 *需要应用 *钩

这里清理后的是一个样本覆盖它:

var el = require('../../modules/electron'); 
 

 
describe('app', function() { 
 
    'use strict'; 
 

 
    var el_override = { 
 
     post: function() { 
 
     }, 
 
     get: function() { 
 
     } 
 
    }, app; 
 

 
    before(function() { 
 
    /* Since we already have electron required, we override it 
 
     from node cache by: 
 
     require.cache['/path/to/file/name'].exports = el_override 
 
    */ 
 

 
    // Require app 
 
    // This will import overridden electron 
 
    App = require('app-location'); 
 
    }); 
 

 
    beforeEach(function() { 
 
    // init app 
 
    app = new App(); 
 
    }); 
 

 
    after(function() { 
 
    // Clean Up both electron override and app by 
 
    // delete requre.cache['/path/to/file/names'] 
 
    }); 
 

 
    it('should test for batch', function() { 
 
    // Call you functions 
 
    }); 
 
});

+0

但是,你需要在开发机器上安装电子以及.. .. ..? –

+0

是在开发机器上安装正常的依赖关系以及dev。在生产上安装正常的依赖关系。 –

+0

这就是我想要避免的... –