2015-08-14 67 views
1

我試圖窺探在控制器中定義的方法工作,但無論我做什麼,我看到測試失敗與消息:間諜不是角,茉莉花和興農

Error: Expected a spy, but got Function.

我使用Karma,Jasmine和Sinon與Angular一起。我非常確定事情的設置是否正確,因爲剛剛讀取$ scope範圍內的屬性的測試通過。

例如,我有這個非常簡單的應用程序模塊:

angular.module('app', []);

而這個簡單的控制器:

angular.module('app').controller('myController', ['$scope', function($scope) { 
    $scope.test = ''; 
    $scope.setTest = function (newString) { 
     $scope.test = newString || 'default'; 
    } 
    $scope.updateTest = function (newString) { 
     $scope.setTest(newString); 
    }; 
}]); 

我的規格文件如下:

describe('myController', function() { 
    'use strict'; 

    beforeEach(module('app')); 

    var $scope, sandbox; 

    beforeEach(inject(function ($controller) { 
     $scope = {}; 
     $controller('myController', { $scope: $scope }); 

     sandbox = sinon.sandbox.create(); 
    })); 

    afterEach(function() { 
     sandbox.restore(); 
    }); 

    describe('#updateTest()', function() { 

     beforeEach(function() { 
      sandbox.spy($scope, 'setTest'); 
     }); 

     it('updates the test property with a default value', function() { 
      $scope.updateTest(); 

      expect($scope.test).toEqual('default'); 
     }); 

     it('calls the setTest method', function() { 
      $scope.updateTest(); 

      expect($scope.setTest).toHaveBeenCalled(); 

     }); 

    }); 
}); 

第一個測試(它只是檢查測試屬性會得到你通過)。

第二個測試,我只是想窺探setTest()方法,失敗並顯示上面的錯誤消息。

如果我註銷$scopebeforeEach我可以看到setTest方法,並且沒有腳本錯誤。

我錯過了什麼?

回答

2

我想這是因爲你在混合茉莉花和Sinon,我不認爲Sinon間諜sandbox.spy()會與Jasmine匹配器expect().toHaveBeenCalled()一起工作。你應該選擇使用哪一個:

  1. 使用興農間諜和結果轉換爲原始將它傳遞給茉莉:

    sandbox.spy($scope, 'setTest'); 
    expect($scope.setTest.called).toBeTruthy(); 
    

    但是這種做法會給你少量輸出:Expected true to be false,而不是通常的Expected spy to have been called

  2. 使用茉莉花間諜:

    spyOn($scope, 'setTest'); 
    expect($scope.setTest).toHaveBeenCalled(); 
    

您也可以看看該工具jasmine-sinon,這增加了額外的茉莉花的匹配,並允許使用興農間諜與間諜茉莉花匹配器。因此,你應該能夠像你的樣品一樣使用:

sandbox.spy($scope, 'setTest'); 
expect($scope.setTest).toHaveBeenCalled(); 
+0

輝煌,我忘了這個包!我將安裝它並嘗試使其工作。我以前面例子中的方式使用了Karma/Jasmine/Sinon,但我並沒有參與設置.... – danwellman

+0

是的,就是這樣,謝謝先生!另外,我必須通過將它添加到Karma加載的文件列表中來加載Karma中的文件。 – danwellman