Я новичок в тестировании, и я пытался найти лучшую стратегию для модульного тестирования контроллера AngularJS с зависимостью от службы. Вот исходный код:
app.service("StringService", function() {
this.addExcitement = function (str) {
return str + "!!!";
};
});
app.controller("TestStrategyController", ["$scope", "StringService", function ($scope, StringService) {
$scope.addExcitement = function (str) {
$scope.excitingString = StringService.addExcitement(str);
};
}]);
И тест, который я использую в настоящее время:
describe("Test Strategy Controller Suite", function () {
beforeEach(module("ControllerTest"));
var $scope, MockStringService;
beforeEach(inject(function ($rootScope, $controller) {
$scope = $rootScope.$new();
MockStringService = jasmine.createSpyObj("StringService", ["addExcitement"]);
$controller("TestStrategyController", {$scope: $scope, StringService: MockStringService});
}));
it("should call the StringService.addExcitement method", function () {
var boringString = "Sup";
$scope.addExcitement(boringString);
expect(MockStringService.addExcitement).toHaveBeenCalled();
});
});
Этот тест проходит, но я кое-что запутался: если я изменю имя метода в сервисе (скажем, я назову его addExclamations
вместо addExcitement
, но не там, где он используется в контроллере (все еще говорит $scope.excitingString = StringService.addExcitement(str);
), мои тесты по-прежнему проходят, даже несмотря на то, что мой контроллер теперь неисправен. Однако, как только я также изменю имя метода в контроллере, чтобы исправить фактическую поломку, вызванную изменением имени метода службы, мои тесты прерываются, потому что он пытается вызвать старый метод addExcitement
.
Это указывало бы на то, что мне нужно будет вручную синхронизировать имена методов со службой, изменив строку объекта jasmine spy на MockStringService = jasmine.createSpyObj("StringService", ["addExclamations"]);
.
Все это кажется мне обратным, так как я чувствую, что мой тест должен сломаться, когда я изменяю имя метода службы, не изменяя, как контроллер ссылается на это имя службы. Но я не уверен, как получить лучшее из обоих миров здесь, потому что, если я ожидаю, что мой тест каким-то образом отслеживает это имя службы, у него нет возможности снова пройти, когда я изменяю имя метода в обоих сервис и контроллер, потому что spyObj все еще имеет старое имя.
Мы будем очень признательны за любое понимание или совет о стратегии, стоящей за этим. Я собираюсь научить этому некоторых студентов и в основном стараюсь убедиться, что следую лучшим практикам.