2015-09-08 4 views
2

Я пытаюсь проверить, как угловая служба отвечает на значения, получаемые от другой службы, когда она инициализирована, и у меня возникли проблемы с поиском неудобного способа ее выполнения. .. гораздо меньше тот, который работает.Тестирование Инициализация службы AngularJS с помощью Mocks

Служба Я пытаюсь тест выглядит вроде как это:

angular.module('myApp') 
    .service('myService', function (Auth, DataGrabber) { 
    var self = this; 

    this.initialize = function() { 
     this.user = Auth.getUser(); 

     if (!this.user.name) { 
     DataGrabber.grabName(); 
     } 

     if (!this.user.birthday) { 
     DataGrabber.grabBirthday(); 
     } 
    } 

    this.initialize(); 
    }) 

А вот не так гладко, как я пытаюсь проверить:

describe('myService', function() { 
    var myService; 
    var dataGrabberMock; 
    var authMock; 
    var grabbedName; 
    var grabbedBirthday; 


    beforeEach(function() { 
    module('myApp') 
    }) 

    beforeEach(function() { 
    grabbedName = false; 
    grabbedBirthday = false; 

    authMock = { 
     getUser: function() { 
     return { 
        name: 'Bob', 
        birthday: 'Feb 22' 
       } 
     } 
    } 

    dataGrabberMock = { 
     grabName: function() { 
      grabbedName = true; 
     }, 
     grabBirthday: function() { 
      grabbedBirthday = true; 
     } 
    } 

    module(function ($provide) { 
     $provide.value('Auth', authMock); 
     $provide.value('DataGrabber', dataGrabberMock); 
    }) 
    }) 

    it ('just gets info if all data is present', function() { 
    inject(function($injector) { 
     myService = $injector.get('myService'); 
     expect(myService.user.name).toBe('Bob'); 
     expect(myService.user.birthday).toBe('Feb 22'); 
    }); 
    }); 

    it ('gets info if name is missing', function() { 
    // how do I stub the new user response here? 
    }) 

    it ('calls birthdayGetter if birthday is missing', function() { 
    // here too? 
    }) 
}) 

Что самый чистый способ изменить значение, которое authMock обеспечивает для каждого теста?

Я пробовал миллионы различных комбинаций инъекций(), $ injector, $ provision и spyOn(). Я, наконец, получил его работу, установив заглушки и шпионы и вызвав myService.initialize() явно в тесте, но затем код инициализации запускается дважды для каждого теста, и это кажется неправильным.

Я новичок в угловом тестировании, поэтому вполне возможно, что есть лучший подход, который я рассматриваю как новичок.

Спасибо!

ответ

2

Существует опечатка в назначении dataGrabbe г Mock

Чтобы изменить значение authMock вы можете создать отдельный метод для создания макета и метода инъекционной службы и вызвать как в вашем контрольная работа.

beforeEach(function() { 
    grabbedName = false; 
    grabbedBirthday = false; 

    dataGrabberMock = { 
    grabName: function() { 
     grabbedName = true; 
    }, 
    grabBirthday: function() { 
     grabbedBirthday = true; 
    } 
    }; 

    spyOn(dataGrabberMock, 'grabName'); 
    spyOn(dataGrabberMock, 'grabBirthday'); 

    module(function ($provide) { 
    $provide.value('Auth', authMock); 
    $provide.value('DataGrabber', dataGrabberMock); 
    }); 
}); 

var authMock; 

function setupAuthMock(name, birthday){ 
    authMock = { 
    getUser: function() { 
     return { 
     name: name, 
     birthday: birthday 
     }; 
    } 
    }; 
} 

function setupAuthMockWithoutName(birthday){ 
    authMock = { 
    getUser: function() { 
     return { 
     birthday: birthday 
     }; 
    } 
    }; 
} 

function setupAuthMockWithoutBirthday(name){ 
    authMock = { 
    getUser: function() { 
     return { 
     name: name 
     }; 
    } 
    }; 
} 

function setupService() { 
    inject(function ($injector) { 
    myService = $injector.get('myService'); 
    }); 
} 

it('just gets info if all data is present', function() { 
    setupAuthMock('Bob', 'Feb 22'); 
    setupService(); 
    expect(myService.user.name).toBe('Bob'); 
    expect(myService.user.birthday).toBe('Feb 22'); 
}); 

it('gets info if name is missing', function() {  
    setupAuthMockWithoutName('Feb 30'); 
    setupService(); 
    expect(dataGrabberMock.grabName).toHaveBeenCalled(); 
}); 

it('calls birthdayGetter if birthday is missing', function() { 
    setupAuthMockWithoutBirthday('Bob'); 
    setupService(); 
    expect(dataGrabberMock.grabBirthday).toHaveBeenCalled(); 
}); 
+0

Спасибо! Я закончил тем, что использовал немного СУШЕНУЮ версию. Это действительно привело меня на правильный путь. – lonesomewhistle

1

Я дал ему еще одну мысль, и я думаю, что использовать отдельные блоки описания вместо использования отдельных методов.

describe('myService', function() { 
    var myService; 
    var dataGrabberMock; 
    var authMock; 
    var grabbedName; 
    var grabbedBirthday; 

    beforeEach(function() { 
    module('myApp'); 
    }); 

    beforeEach(function() { 
    grabbedName = false; 
    grabbedBirthday = false; 

    dataGrabberMock = { 
     grabName: function() { 
     grabbedName = true; 
     }, 
     grabBirthday: function() { 
     grabbedBirthday = true; 
     } 
    }; 

    spyOn(dataGrabberMock, 'grabName'); 
    spyOn(dataGrabberMock, 'grabBirthday'); 

    module(function ($provide) { 
     $provide.value('Auth', authMock); 
     $provide.value('DataGrabber', dataGrabberMock); 
    }); 
    }); 

    describe('when all data is present', function() { 
    beforeEach(function() { 
     authMock = { 
     getUser: function() { 
      return { 
      name: 'Bob', 
      birthday: 'Feb 22' 
      }; 
     } 
     }; 
    }); 

    beforeEach(function() { 
     inject(function ($injector) { 
     myService = $injector.get('myService'); 
     }); 
    }); 

    it('just gets info', function() { 
     expect(myService.user.name).toBe('Bob'); 
     expect(myService.user.birthday).toBe('Feb 22'); 
    }); 
    }); 

    describe('when name is missing', function() { 
    beforeEach(function() { 
     authMock = { 
     getUser: function() { 
      return { 
      birthday: 'Feb 22' 
      }; 
     } 
     }; 
    }); 

    beforeEach(function() { 
     inject(function ($injector) { 
     myService = $injector.get('myService'); 
     }); 
    }); 

    it('gets info', function() { 
     expect(dataGrabberMock.grabName).toHaveBeenCalled(); 
    }); 
    }); 

    describe('when birthday is missing', function() { 
    beforeEach(function() { 
     authMock = { 
     getUser: function() { 
      return { 
      name: 'Bob', 
      }; 
     } 
     }; 
    }); 

    beforeEach(function() { 
     inject(function ($injector) { 
     myService = $injector.get('myService'); 
     }); 
    }); 

    it('calls birthdayGetter', function() { 
     expect(dataGrabberMock.grabBirthday).toHaveBeenCalled(); 
    }); 
    }); 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^