2016-09-26 124 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/ –