【问题标题】:How to unit test that a filter has been called in a service如何对已在服务中调用的过滤器进行单元测试
【发布时间】:2015-11-05 21:16:10
【问题描述】:

我无法断言我的过滤器在返回承诺后已被调用。

此代码从控制器调用,然后从 http GET 服务中提取数据以进行过滤:

getPermissions(){
    return this.DataService.getPermissionsLOV().then((data) => {
        return this.$filter('chunkCollection')(data, 3);
    });
}

我的测试用例是这样的:

it('should get the permissions', () => {
    spyOn(service, 'getPermissions').and.callThrough();
    spyOn(DataService, 'getPermissionsLOV').and.callFake(function(){
        var defer = this.$q.defer();
        defer.resolve(mockData);
        return defer.promise;
    });

    let resp;

    service.getPermissions().then((data) => {
        resp = data;
    });

    scope.$digest();

    expect(service.getPermissions).toHaveBeenCalled();
    expect(DataService.getPermissionsLOV).toHaveBeenCalled();
    expect(resp).toEqual(mockData);

});

断言expect(resp).toEqual(mockData); 失败,因为响应被chunkCollection 过滤,但我不知道如何测试对$filter 的调用?

我已经单独测试了过滤器本身,所以知道它正在工作,并且 karma 告诉我它在报告上述断言失败时正在转换数据。

【问题讨论】:

    标签: javascript angularjs filter jasmine spy


    【解决方案1】:

    由于您知道什么是模拟响应并且您也知道过滤器是什么,因此您知道如果过滤器正常工作,过滤器将返回多少行。您只需要在过滤器完成后断言已解析的集合包含确切的项目和计数。如果过滤器正常工作,则此数据将匹配。

    【讨论】:

    • 其实我完全错了。分配给 resp 的数据返回未定义。
    • 您可以在过滤器行下一个断点,看看过滤器获取的数据是什么。
    【解决方案2】:

    我认为您的问题实际上是如何模拟过滤器。您可以在测试前添加beforeEach 并提供过滤器。

    var mockChunkCollectionFilter = jasmine.createSpy('chunkCollectionFilter');
    beforeEach(module(function($provide) {
      $provide.value('chunkCollectionFilter', mockChunkCollectionFilter);
    }));
    
    it('should get the permissions', () => {
        spyOn(service, 'getPermissions').and.callThrough();
        spyOn(DataService, 'getPermissionsLOV').and.callFake(function(){
            var defer = this.$q.defer();
            defer.resolve(mockData);
            return defer.promise;
        });
        mockChunkCollectionFilter.and.callFake(function (data, chunks) {
          // Ignore chunks since that's what the test expects.
          return data;
        });
    
        let resp;
    
        service.getPermissions().then((data) => {
            resp = data;
        });
    
        scope.$digest();
    
        expect(service.getPermissions).toHaveBeenCalled();
        expect(mockChunkCollectionFilter).toHaveBeenCalled();
        expect(DataService.getPermissionsLOV).toHaveBeenCalled();
        expect(resp).toEqual(mockData);
    
    });
    

    mockChunkCollectionFilter 就像你的其他间谍一样工作。

    【讨论】:

    • 如何将它集成到测试用例中?抱歉,我是新手,所以有点挣扎。
    • @RyanP13 当然,扩展了我的答案。让我知道这是否有帮助
    • 谢谢!我一直在寻找这样的例子。我见过的几个例子之一,它展示了如何模拟过滤器并在 it 函数中使用 callFake,以便过滤器可以在不同的场景中返回不同的值。
    猜你喜欢
    • 2020-07-10
    • 2014-04-30
    • 2014-02-01
    • 2018-05-23
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多