コントローラの$ scopeオブジェクトをテストするにはどうすればよいですか?
添付された実際のデータを取得できましたか?
私のテストは以下のように設定されていますが、myScope
はundefined
です。
'use strict';
describe('myApp.view1 module', function() {
var $httpBackend, $rootScope, createController, jsonHandler;
beforeEach(module('myApp.view1'));
describe('view1 controller', function(){
beforeEach(inject(function($rootScope, $controller, $injector) {
// Set up the mock http service responses
$httpBackend = $injector.get('$httpBackend');
// backend definition common for all tests
$httpBackend.when('GET', 'view1/quizzes.json')
.respond({data: '[XXX,XXX,XXX]'});
// Get hold of a scope (i.e. the root scope)
$rootScope = $injector.get('$rootScope');
// The $controller service is used to create instances of controllers
var $controller = $injector.get('$controller');
var myScope = $rootScope.$new()
createController = function() {
return $controller('View1Ctrl', {'$scope' : myScope });
};
var controller = createController();
}));
it('should get the json files', function(){
$httpBackend.expectGET('/view1/quizzes.json');
});
it('should get the json files', function(){
expect(myScope).toBe("words");
});
});
});
コントローラ:
myApp.controller('View1Ctrl', [
'$scope',
'$http',
function($scope, $http) {
$http.get('view1/quizzes.json')
.then(function(res){
$scope.quizzes = res.data.quizzes
})
.then(function(){
$http.get('view1/questions.json')
.then(function(res){
$scope.questions = res.data.questions
})
.then(function(){
$scope.quiz = [ [], [], [], [], [] ]
_($scope.questions).forEach(function(qu){
_($scope.quizzes).forEach(function(quiz){
if (_.includes($scope.quizzes[(quiz.id - 1)].question_ids, qu.id)){
$scope.quiz[(quiz.id - 1)].push(qu)
}
})
})
})
.then(function(){
// console.log($scope.quiz)
})
});
}
]);
ここで、「myScope」の値をログに記録していますか?なぜ、$ injector.get()を使用して、関数に既に注入されているサービスを取得していますか? –
@JBNizet私は別のテストでそれを記録していましたが、それは唯一のものでしたので、私はそこに追加しませんでした。私はひどく混乱しているし、何をしているのか分からないので、おそらく$ injector.get()を使用しています。ドキュメントはうまくいきません。/ – IAmAkittycatAMA
myScopeはbeforeEachに渡される関数のローカル変数です。したがって、それはその機能でのみ定義されています。それを渡された関数で定義したい場合は、$ httpBackend、$ rootScopeなどと同じレベルで宣言する必要があります。 –