2014-03-03 34 views
1

我試圖模擬出這種「的UserManager」提供者在我的控制器的測試和我總是最後得到這個錯誤類型錯誤只讀屬性角因緣測試:

TypeError: Attempted to assign to readonly property. 
at workFn (c:{...}/bower_components/angular-mocks/angular-mocks.js:2105) 

這裏是我的控制器:

angular.module('sasApp') 
.controller('RegisterCtrl', function ($scope, usermanager) { 

    // variables 
    $scope.captcha = {}; 

    // Get captcha from server 
    usermanager.getCaptcha().then(function (captcha) { 
    $scope.captcha = captcha; 
    }, function (reason) { 
    console.log('Failed: ' + reason); 
    }); 
}); 

這裏是我的測試:

describe('Controller: RegisterCtrl', function() { 
    // load the controller's module 
    beforeEach(module('sasApp')); 

    var RegisterCtrl, 
     scope, 
     mockUsermanager; 

    mockUsermanager = { 
    getCaptcha: function() { 
     return { 
     test: 1 
     }; 
    } 
    }; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope) { 
    scope = $rootScope.$new(); 
    RegisterCtrl = $controller('RegisterCtrl', { 
     $scope: scope, 
     usermanager: mockUsermanager 
    }); 
    })); 

    describe('Initialization', function() { 

    it('should have \'captcha\' object defined', function() { 
     expect(scope.captcha).toBeDefined(); 
    }); 
    }); 
}); 

的事情是,直到我試圖建立我沒有得到這個錯誤嘲笑'用戶管理'提供商。如果我在beforeEach語句中刪除'usermanager:mockUsermanager'這一行,那麼它運行良好。

你能發現有什麼問題嗎?提前致謝!

回答

1

它可能不是最好的答案,但我做了一個Plnkr不會重現這裏的問題: http://plnkr.co/GgUeKnsvxEHmD3Wcyocx?p=preview

快速注意: usermanager.getCaptcha()必須返回一個承諾,否則測試的下一部分會當它試圖呼籲.then炸燬。所以我只是把一個虛假的。

讓我知道,如果你發現任何差異(我不知道你是什麼角度的版本)。我可以看到有關更新

+0

感謝您的支持。當我向我的模擬添加承諾時,所有測試都通過了。我試圖在你的plunkr中重現錯誤,並且我設法得到了,我認爲只有錯誤信息更有意義。 http://plnkr.co/edit/k0GyXosvBw3qMHCU9Xhh?p=preview - 可能由於茉莉花版本不匹配而導致此錯誤消息? – Bjarki