2014-07-23 64 views
1

我正在開發一個駐留在Android WebView中的Angular應用程序。自定義角度窗口依賴

window.MyAndroidApp 

它擁有一些方法,如:爲了讓我的Android應用進行互動,我在窗口範圍暴露的對象

window.MyAndroidApp.doStuff(); 
window.MyAndroidApp.doOtherStuff(); 

我很困惑,我怎麼能與此互動對象通過一個Angular控制器而不直接引用它,這樣我可以通過單元測試來嘲弄它?

// How do I define androidFunctions as window.MyAndroidApp so that 
// I may mock it for unit testing? 
app.controller("MyCtrl", ["$scope", "androidFunctions", function($scope, androidFunctions) { 
    androidFunctions.doStuff(); 
    androidFunctions.doOtherStuff(); 
}]); 

回答

1

把它變成服務 - 然後你可以用普通的方式來模擬它。

angular.module('myApp').factory('androidManager', [$window, function ($window) { 
    return $window.MyAndroidApp; 
}); 

當你把它放在窗口也將在$窗口,你甚至可以嘲笑它使用的東西,這樣像sinon

sinon.mock($window, 'MyAndroidApp', { 
    doStuff: function() {....}, 
    doOtherStuff: function() {..} 
}); 
1

可以使用角度$window服務

來自文檔

對瀏覽器窗口對象的引用。儘管JavaScript在全球範圍內可用,但它會導致可測試性問題,因爲它是一個全局變量。在角度上我們總是通過$ window服務來引用它,所以它可能會被覆蓋,刪除或模擬以進行測試。 https://docs.angularjs.org/api/ng/service/$window

<script> 
    angular.module('windowExample', []) 
    .controller('ExampleController', ['$scope', '$window', function ($scope, $window) { 
     $scope.greeting = 'Hello, World!'; 
     $scope.doGreeting = function(greeting) { 
     $window.alert(greeting); 
     }; 
    }]); 
</script>