我的代码中有这样的内容。
$scope.callMe = function(test){
...
myService.test(
{'price':price, 'name':name, 'category': category, 'test': test}
) // category, price are complex objec
...
}
我的单元测试
it('should check the params', function(){
spyOn(myService.test).and.callThrough();
$scope.callMe('test1');
expect(myService).toHaveBeenCalled();
}
我想创建一个单元测试,以查看是否使用变量myService
调用'test1'
。我不想使用toHaveBeenCalledWith()
,因为我必须模仿一堆复杂的对象,我不想这样做。以上测试不会这样做。有办法解决吗?非常感谢!
答案 0 :(得分:1)
模仿一堆复杂的对象是单元测试的一部分。灯具的整个概念都致力于此。
从规范中分离数据并不罕见,可以方便地序列化现有对象,而不是从头开始制作假货。
var someServiceFixture = require('./fixtures/someService.json');
...
expect(myService.test).toHaveBeenCalledWith(someServiceFixture);
当某些参数与正面无关时,可以跳过固定装置,支持使用以下方法进行宽松的参数检查:
expect(myService.test).toHaveBeenCalledWith({'price': jasmine.any(Object), ...);
在控制器单元测试中,除了控制器之外的所有东西都应该被模拟,只有一个单元在时间上被测试。这是当前规范中最合适的情况。控制器不必满足带有效参数的存根服务:
spyOn(myService, 'test'); // should be stubbed
$scope.price = jasmine.createSpy('price'); // should be exposed to scope to be mocked
$scope.callMe('test1');
expect(myService.test).toHaveBeenCalledWith({'price': $scope.price, ...);
toHaveBeenCalledWith
对对象执行深度相等检查,{}
虚拟对象比较可能无效。如果控制器代码不依赖于price
类型,则可以使用间谍(或任何其他虚函数)代替对象参数来严格比较它。