【问题标题】:Angular - Material - Testing - $mdSidenav角 - 材料 - 测试 - $mdSidenav
【发布时间】:2015-06-11 04:05:57
【问题描述】:

我第一次在 Stack 上写一个问题;) 我在测试 $mdSidenav 时遇到问题(角材料组件。请参阅https://material.angularjs.org/)。 在我的控制器中,我有类似的东西:

$scope.toggleRight = function() {
    $mdSidenav('right').toggle();
};

我想测试一下。所以在我的测试文件中,我首先创建了这个对象的模拟:

var $mdSidenav = function(test){
        return {
            toggle: function(){
                return true;
            }
        };
    };

    beforeEach(inject(function ($controller) {
        $scope = $rootScope.$new();
        createController = function () {
            return $controller('headerCtrl', {
                '$scope': $scope,
                '$mdSidenav': $mdSidenav
            });
        };
    }));

然后我正在尝试测试它:

describe('toggleRight method', function(){
        beforeEach(function(){
            spyOn($mdSidenav('right'), 'toggle').and.callThrough();
        });

        it('Should toggleRight open/close', function(){
            $scope.toggleRight();
            expect($mdSidenav('right').toggle).toHaveBeenCalled();
        });

    });

但是 karma 将这个错误发送给我:

错误:预期是间谍,但得到了函数。

我希望有人可以帮助我;)

【问题讨论】:

    标签: angularjs testing jasmine angularjs-material


    【解决方案1】:

    您可以尝试不同的方法,使用 $provide 和匿名模块来注入模拟。

    我这里用的是sinon,不过你可以改成合适的Jasmine代码:

    var spy = sinon.spy();
    
    beforeEach(module(function ($provide) {
      $provide.value('$mdSidenav', function (v) {
        return {
          toggle: spy
        }
      });
    }));
    

    然后在测试中:

    sinon.assert.calledOnce(spy);
    

    【讨论】:

    • 欢迎您的回复!但什么是'sinon'?我不明白... ;)
    • Sinonjs.org 只是一种在 Javascript 中监视、存根或模拟的不同方式。您可以使用 Jasmine 代替,只需将 sinon 用法替换为您的 Jasmine 代码即可。
    猜你喜欢
    • 2017-08-11
    • 2018-06-17
    • 2015-10-09
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多