2017-10-05 57 views
2

我正在努力獲得使用Jasmine測試的一些Typescript類。我創建了一些類,通過模塊的聲明相互組成:這在茉莉花測試中意味着什麼:Uncaught TypeError:對象原型可能只是一個Object或null:undefined?

module xxx.DeviceData { 
    export class ConsoleListener extends DataListener { 
     constructor() { 
      super("ConsoleListener"); 
     } 

     addData(data: string) { 
      console.log(this.title + ": " + data); 
     } 

     clear() { 
      console.clear(); 
     } 
    } 
} 

我撰寫的茉莉花測試一起以同樣的方式:

module xxx.DeviceData { 
describe('ConsoleListener test', function() { 
    var consoleListener, 
     consoleListenerObj; 

    beforeEach(() => { 
     consoleListener = jasmine.createSpy("consoleListener"); 

     consoleListenerObj = jasmine.createSpyObj('consoleListenerObj', ['onSuccess', 'onFailure', 'addData', 'clear']); 
     consoleListenerObj.onSuccess(); 
     consoleListenerObj.onFailure(); 
     consoleListenerObj.addData(); 
     consoleListenerObj.clear(); 
    }); 

    it('test#1 columnDefinition defined', function() { 
     let consoleListener = new ConsoleListener(); 

     expect(consoleListener).not.toBeNull(); 
    }); 

    it('test#2 call onSuccess', function() { 
     expect(consoleListenerObj.onSuccess).toHaveBeenCalled(); 
    }); 

    it('test#3 call onFailure', function() { 
     expect(consoleListenerObj.onFailure).toHaveBeenCalled(); 
    }); 

    it('test#4 call addData', function() { 
     expect(consoleListenerObj.addData('123')); 
    }); 

    it('test#5 call clear', function() { 
     expect(consoleListenerObj.clear()); 
    }); 
}); 
} 

這一切都完美transpiles。當我嘗試執行測試,我收到此錯誤

遺漏的類型錯誤:對象的原型可能只是一個對象或null:在腳本/ DeviceData/ConsoleListener.js未定義:5:27

事情錯了在傳送的JS的第5行,對不對?這裏是:

var __extends = (this && this.__extends) || (function() { 
    var extendStatics = Object.setPrototypeOf || 
     ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 
     function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; 
    return function (d, b) { 
     extendStatics(d, b); 
     function __() { this.constructor = d; } 
     d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 
    }; 
})(); 
var xxx; 
(function (xxx) { 
    var DeviceData; 
    (function (DeviceData) { 
     var ConsoleListener = (function (_super) { 
      __extends(ConsoleListener, _super); 
      function ConsoleListener() { 
       return _super.call(this, "ConsoleListener") || this; 
      } 
      ConsoleListener.prototype.addData = function (data) { 
       console.log(this.title + ": " + data); 
      }; 
      ConsoleListener.prototype.clear = function() { 
       console.clear(); 
      }; 
      return ConsoleListener; 
     }(DeviceData.DataListener)); 
     DeviceData.ConsoleListener = ConsoleListener; 
    })(DeviceData = xxx.DeviceData || (xxx.DeviceData = {})); 
})(xxx|| (xxx= {})); 
//# sourceMappingURL=ConsoleListener.js.map 

當然,第5行似乎是在談論對象和原型。

我試過不同的方式讓模塊彼此交談,但是這個模塊方法是我能夠始終如一地工作的唯一方法。需要在這裏傳遞的業力/茉莉花背景中是否缺少某些東西?

這裏是我的karma.config:

module.exports = function (config) { 
     config.set({ 

      frameworks: ["jasmine","karma-typescript"], 

      preprocessors: { 
       "Scripts/**/*.ts": ["karma-typescript"] 
      }, 

      files: [ 
       'Scripts/DeviceData/*.ts', 
       'Scripts/UnitTests/*.spec.ts' 
      ], 

      exclude: [ 
       'Scripts/**/NodeJSDataSocket.ts' 
      ], 
      reporters: ["progress", "karma-typescript"], 

      //reporters: ["dots", "karma-typescript"], 

      browsers: ["Chrome"], 
      karmaTypescriptConfig: { 
       compilerOptions: { 
        "module": "commonjs", 
        "sourceMap": true, 
        "target": "es5" 
"moduleResolution": "classic", 
"noImplicitAny": false 
       }, 
       tsconfig: "./tsconfig.json", 
      }, 
     }); 
    }; 

回答

2

錯誤看起來是從extends功能打字稿未來當你從一個超類繼承注入。

看代碼,我會說你DataListener不提供給你,當你使用它:

extends DataListener 

它可能是不完全丟失,否則編譯器會提醒你 - 那麼它要麼是茉莉花運行時不包括(即加載),或者你的東西裝載不規則。

讓他們有序,並希望...歡樂!

 files: [ 
      'Scripts/DeviceData/DataListener.ts', 
      'Scripts/DeviceData/ConsoleListener.ts', 
      'Scripts/UnitTests/*.spec.ts' 
     ], 
+0

優秀 - 這在回顧過程中顯得很明顯。我的第一個想法是,它沒有包含在karma.config中,但它應該是 - 我已經在上面發佈了。任何其他想法爲什麼它不包括在內?與此同時,我有一個獨立的文件可以分離和測試以確認這一點。 –

+0

是的,這工作,所以它絕對是在那裏繼承。 –

+0

哪個文件是'DataListener'中的? – Fenton

1

__extends() function由TypeScript編譯器生成以處理類繼承。 b表示基類,d表示派生類。所以,問題是缺少基類DataListener。檢查編譯和捆綁腳本的方式。一個命名空間(參見module關鍵字)可以在多個文件中定義,但是它們的收集/捆綁必須由專人或使用compiler option --outFile來處理。