2016-05-20 51 views
1

我有下面的構造函數,它需要幾個參數。使用sinon參數構造函數的存根

constructor(url: string, mqttOptions: MqttOptions, messageReceivedCallBack: IMessageReceivedCallBack) { 
    if (!_.isString(url) || _.isEmpty(mqttOptions || _.isEmpty(messageReceivedCallBack))) { 
    throw new MyNodeError('invalid url value'); 
} else { 
     this.createConnection(url,mqttOptions); 
} 
} 

如何創建使用興農,以驗證時的參數之一是空的拋出一個異常間諜實例?我看到這個問題Mocking JavaScript constructor with Sinon.JS,但它是一個沒有參數的構造函數。任何幫助將非常感激。

回答

1

請嘗試以下方法是否適合你!

import {assert} from 'chai'; 
import MyNodeError from './path/to/MyNodeError' 
import ClassToTest from './path/to/Class'; 

describe('MyClass', function() { 
    function test() { 
     new ClassToTest('', {}, null); 
    } 
    it("Should throw exception when invalid parameters passed", function(){ 
     assert.throw(test, MyNodeError, "invalid url value"); 
    }); 
}); 
1

我不明白爲什麼你需要爲此創建一個間諜?你應該能夠只是測​​試它像這樣:

it('should throw if one of the parameters is empty', function() { 
    expect(constructor.bind(null, null, mqttOptions, messageReceivedCallback)).to.throw(MyNodeError); 
} 

url參數設置爲null和我假設變量mqttOptionsmessageReceivedCallback要定義的例子(未顯示)。

這一點,例如,反映您要查找的內容(如果我理解正確的問題)和按預期工作對我來說:

it.only('', function() { 
    function C(a) { if (!a) throw new TypeError('a was empty'); } 
    expect(C.bind(null, 'b')).to.not.throw(TypeError); 
    expect(C.bind(null, null)).to.throw(TypeError); 
})