使用Jasmine在ajax请求中测试Angular范围变量

时间:2015-03-03 00:20:30

标签: javascript ajax angularjs jasmine karma-jasmine

我想知道如何在我的控制器中测试一些在ajax请求中创建的Angular范围变量。

我的意思是......这是我的控制者:

app.controller('NewQuestionCtrl', function ($scope, Question) {
   loadJsonAndSetScopeVariables($scope, Question);
});

function loadJsonAndSetScopeVariables(scope, Question) {
  Question.loadJson().then(function(success) {
  var result = success.data.variables;

  scope.levels = result.levels;
  scope.tags = result.tags;
  scope.difficulties = result.difficulties;
  scope.questionTypes = result.questionTypes;
  scope.areas = result.areas;

},function(data){

 });
}

其中一个先决条件是不使用mock。 在我的测试中,我能够注入我的问题服务:

describe('Controller: NewQuestionCtrl', function () {

beforeEach(angular.mock.module('testmeApp'));

var NewQuestionCtrl, scope, QuestionService;

beforeEach(inject(function ($controller, $rootScope, Question) {
  scope = $rootScope.$new();
  QuestionService = Question;
  NewQuestionCtrl = $controller('NewQuestionCtrl', {
  $scope: scope
 });
}));

it('should attach a list of areas to the scope', function (done) {
  expect(scope.areas).toBeDefined();
  done();
});

拜托,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

为Question创建一个模拟并使用它。有几种方法可以做到这一点。这只是其中之一。

你可以选择注入一个真实的问题实例和间谍,但最好将模拟器与问卷单元测试隔离开来。

var questionDeferred, myController, scope;
var mockQuestion = {
  loadJson: angular.noop
};

beforeEach(inject(function($q, $rootScope, $controller) {
  questionDeferred = $q.defer();
  scope = $rootScope.$new();
  spyOn(mockQuestion, 'loadJson').and.returnValue(questionDeferred);

  // Because your function is run straight away, you'll need to create
  // your controller in this way in order to spy on Question.loadJson()
  myController = $controller('NewQuestionCtrl', {
    $scope: scope,
    Question: mockQuestion
  });
}));

it('should attach a list of areas to the scope', function (done) {
  questionDeferred.resolve({/*some data*/});
  scope.$digest();

  expect(scope.areas).toBeDefined();
  done();
});