【问题标题】:Testing a filter used within a controller function测试控制器功能中使用的过滤器
【发布时间】:2015-08-01 03:49:48
【问题描述】:

我有以下测试用例:

it('should return id if the post is successful',function(){
       var result = {
               id : "123"
       };
        ctrl.saveCallback(result);
        expect(ctrl.method.id).to.equal("123");
    });

其中ctrl.saveCallbackresult.id 复制到ctrl 上的method.id,然后显示成功横幅。在成功横幅上,我们使用translate 过滤器在显示消息之前对其进行翻译。

功能:

.....
ctrl.method.id = result.id;
magicallyShowOnScreen($filter('translate')('MESSAGES.SUCCESS'));
....

magicallyShowOnScreen 是一个服务,它显示我们传递到屏幕上的任何字符串,并且已经被注入到 beforeEach 中。

有人可以指出我应该如何测试或模拟这个$filter('translate')的正确方向吗?

【问题讨论】:

  • 你在用诗乃,柴?你能说明你是如何在你的beforeEach 中注入magicallyShowOnScreen 的吗?

标签: angularjs filter karma-mocha


【解决方案1】:

前言:我不熟悉 Mocha.js 也不熟悉如何创建间谍,但是您仍然可以像其他测试框架一样注入它们或类似的模拟对象。

以下是 Jasmine 示例,希望对您有所帮助。


当你引导你的模块(使用module/angular.mocks.module)函数时,你应该提供你自己版本的$filter,它应该是一个返回另一个模拟/间谍的模拟/间谍。例如

var $filter, filterFn;
beforeEach(module('myModule', function($provide) {
    $filter = jasmine.createSpy('$filter');
    filterFn = jasmine.createSpy('filterFn');
    $filter.and.returnValue(filterFn);

    $provide.value('$filter', $filter);
});

然后,在您的测试中,您可以确保使用正确的参数调用 $filter,例如

expect($filter).toHaveBeenCalledWith('translate');
expect(filterFn).toHaveBeenCalledWith('MESSAGE.SUCCESS');
expect(magicallyShowOnScreen).toHaveBeenCalled(); // assuming this too is a spy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多