2016-04-15 4 views
0

У меня возникли проблемы с выяснением того, как правильно писать тесты для метода контроллера, который полагается на вызов службы углов и возврат определенного значения, но мне нужно иметь возможность проверьте код в функции .then() после.Возвращаемые значения из разрозненного углового обслуживания и вызова через

Вот основная идея:

// Controller 

$scope.myMethod = function() { 
    methodName.connect().then(
     function(returnValue) { 
      if (returnValue.prop === 1) { 
       $scope.callMade = true; 
       $rootScope.$emit('callWasMade'); 
      } 
     }, 
     function() { 
      $rootScope.$emit('callWasNotMade'); 
     } 
    ); 
}; 

Так что я хочу, чтобы проверить вызов метода на $ рамки, вызовите methodName.connect() функцию, но я хочу, чтобы дразнить ответ (перезапись ReturnValue), но все же функция работает нормально. Что-то вроде:

// Test 

describe('connecting to method', function() { 
    it('should do nothing when returnValue.prop does not equal 1', function() { 
     spyOn(methodName, 'connect').and.returnValue({ prop: 2 }); 
     scope.myMethod(); 
     expect(scope.callMade).toBeFalsy(); 
    }); 

    it('should pass when returnValue.prop does equal 1', function() { 
     spyOn(methodName, 'connect').and.returnValue({ prop: 1 }); 
     scope.myMethod(); 
     expect(scope.callMade).toBeTruthy(); 
    }); 
}); 

За исключением этого возвращает

undefined is not a constructor (evaluating 'methodName.connect().then') (...) 

Как я могу контролировать выход из methodName.connect таким образом?

Спасибо.

+0

Поскольку 'methodName' не прилагается на сферу, вы можете создать шпиона, как' spyOn (имяМетода, 'Connect') '. Ваша проблема заключается в том, что ваши коды не разделяют проблемы. Так что трудно проверить. – Qianyue

+0

Так что я должен приложить методName к области? В этом примере methodName предназначен для представления службы. – AMcI

ответ

0

Как вы говорите, методName - это сервис. Поэтому просто издевайтесь над этой службой в контроллере.

Кроме того, у меня есть вопрос для вашего контроллера. Почему myMethod прикреплен к области видимости, но не сам контроллер (например: myMethod = function() {})?

Приведенные ниже коды должны работать:

describe('connecting to method', function() { 
    beforeEach(inject(function($controller, $rootScope) { 
    // create a mock service attached to controller 
    methodName = { 
     connect: function() { 
     } 
    }; 

    spyOn(methodName, 'connect').and.returnValue({ prop: 2 }); 

    scope = $rootScope.$new(); 
    controller = $controller('yourCtrl', { 
     $scope: scope, 
     methodName : methodName 
    }); 
    })); 

    it('should do nothing when returnValue.prop does not equal 1', function() { 
    // here I consider myMethod is a method of controller, but not of the scope 
    myMethod(); 
    expect(scope.callMade).toBeFalsy(); 
    }); 
}); 
+0

Привет, Qianyue, я до сих пор получаю эту ошибку: 'TypeError: undefined не является объектом (оценивая 'myMethod.connect(). Then')'. В этом случае myMethod - это служба, которая будет подключаться к websocket и возвращать выполненное обещание с объектом, тогда мне нужно проверить, соответствует ли значение 'returnValue.prop' 1, чтобы установить некоторые переменные с областью. Если это не так, он ничего не должен делать. – AMcI

+0

@AMcI Обратите внимание, что здесь я просто даю вам представление о том, как тестировать контроллер с сервисом. И мои коды предполагают, что в вашем контроллере myMethod находится под контроллером, но не в области. Можете ли вы создать jsfiddle, чтобы показать свою проблему? Я не могу сказать, где проблема, потому что для меня недостаточно информации. – Qianyue

+0

Привет, Qianyue - После некоторого размышления над выходными, я думаю, что, возможно, я ошибаюсь так, как вы сказали, я думаю, мне нужно больше отделить проблемы. Спасибо за помощь! – AMcI