2016-09-26 104 views
1

我正在使用SinonEnzyme進行測試。我有一個函數,它接收一組對象並將其轉換爲一個新的不同數組。Sinon:測試函數返回值

getContainersByHostId(data) { 
    return _.chain(data) 
     .groupBy('hostId') 
     .toPairs() 
     .map(currentItem => _.zipObject(['hostId', 'containers'], currentItem)) 
     .value(); 
    } 

參數數量:

const containers = [{ 
      id: 'c_01', 
      hostId: 'h_01', 
      hostIp: '192.168.1.0', 
      name: 'Some Container' 
     }]; 

結果:

[{hostId: 'h_01', 
containers: [{ 
hostId: 'h_01', 
ip: '192.168.1.0', 
id: 'c_01', 
name: 'Some Container' 
}]}]; 

這工作得很好。但是,我面臨的問題是在單元測試中。所以目前我有這個。

const containers = [{ 
      id: 'c_01', 
      hostId: 'h_01', 
      hostIp: '192.168.1.0', 
      name: 'Indigo Container' 
     }]; 

     const wrapper = shallow(<Groups {...props} />); 
     const instance = wrapper.instance(); 
     sandbox.stub(instance, 'getContainersByHostId'); 
     instance.getContainersByHostId(containers); 
     expect(instance.getContainersByHostId.calledWith(containers)).to.equal(true); 
     }); 

如何測試傳遞的參數是否等於新數組?

更新:

我試圖returnValue,但它給了我假的,我無法找到任何可能的解決方案,以檢查它真的回來了。

+0

你想要聲明什麼?我想你應該有2個數組,一個用於輸入,另一個用於預期的輸出。所以你只是斷言用該輸入調用'getContainersByHostId'應該返回期望的輸出。這是你想實現的嗎? –

+0

這正是我想要斷言的。但是當我對輸出數組聲明它時,它給了我未定義的內容。你可以寫一個例子來說明我是如何做到的。也許我做錯了什麼。我也會編輯我的問題 – Umair

+0

@LazarevAlexandr – Umair

回答

2

首先,當你存儲一個函數時,你取消了它的所有行爲,所以如果你沒有爲這個存根指定一些值來返回,那麼它將返回undefined。很可能你已經與sinon.spy()混淆了。

如果我正確地理解了你,你所需要的一切都可以變得更加簡單。根本不需要Sinon。例如:

const modified = instance.getContainersByHostId(inputArray);  
expect(modified).to.eql(expectedArray); 
+0

好吧,我知道我在這裏做了一些非常愚蠢的事情。你是對的。但我不確定我是否明白你的第一點。你說我必須指定返回值?你能否詳細說明一下?我基本上想知道爲什麼它首先拋出undefined。 – Umair

+0

你說什麼,你是說我不需要間諜或製作類的方法?既然,你直接在原有功能上聲稱?我的印象是,我們應該用間諜或存根來做這件事?如果你能向我深入解釋這一點,我將非常感激。 – Umair

+0

好的,因爲在測試用例中有一個手動函數調用:'instance.getContainersByHostId(containers);''''''''''''''''''''''''''''''''''''''如果不控制函數調用,則使用存根或間諜。在大多數情況下,當你調用某些東西時會使用它們,這會觸發間諜方法。 至於_specify返回值_,我提到了'stub.returns(obj);'這個方法使存根返回提供的值。你可以仔細看看Sinon api:http://sinonjs.org/docs/ –