如何在我的案例中为函数创建单元测试

时间:2016-05-29 06:43:23

标签: angularjs unit-testing jasmine

我的代码中有这样的内容。

$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(),因为我必须模仿一堆复杂的对象,我不想这样做。以上测试不会这样做。有办法解决吗?非常感谢!

1 个答案:

答案 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类型,则可以使用间谍(或任何其他虚函数)代替对象参数来严格比较它。