2016-12-21 13 views
0

У меня есть Угловой завод так:Разница между вызовом this.function() и функциями() в угловом Factory

angular 
    .module('app.myModule') 
    .factory('myFactory', myFactory); 

myFactory.$inject = []; 

function myFactory() { 

    var factory = { 
     func1: func1, 
     func2: func2 
    }; 

    return factory; 

    ////////// 

    function func1() { 
     if (/* some condition */) { 
      return true; 
     } else { 
      return false; 
     } 
    }; 

    function func2() { 
     if (func1()) { 
      // do something 
     } else { 
      // do something else 
     } 
    }; 

}; 

func2() будет делать что-то в зависимости от результата вызова func1, но func1() не это частная функция, потому что мне интересно разоблачить ее.

Все было в порядке, пока я не начал кодировать модульные тесты этой фабрики. При тестировании func2() я хочу заглушить func1(), чтобы вернуть true/false всякий раз, когда я хочу.

До сих пор я закодировал тест:

describe('Test func2 if func1 returns false', function() { 

    beforeEach(function() { 
     // func1 stub setup 
     sinon.stub(myFactory, 'func1'); 
     myFactory.func1.returns(false); 

     // HERE myFactory.func1() RETURNS 'false' 
    }); 

    it('should do something else', function (done) { 
     // HERE func1() CALLED INSIDE myFactory.func2() IS NOT THE STUB 

     myFactory.func2(); 

     // Do some assertions, etc. 
    }); 

}); 

, но я заметил, что если бы я сделал небольшое изменение func2() кода myFactory, вызывая this.func1() вместо func1() так:

function func2() { 
    if (this.func1()) { 
     // do something 
    } else { 
     // do something else 
    } 
}; 

от point on, в тестах всегда вызывается функция func1().

На данный момент я просто смущен. Кто-нибудь знает, что может происходить здесь? Было бы более «правильным» назвать любой другой публичный метод/функцию внутри моих угловых фабрик с this., если он принадлежит к той же фабрике?

UPDATE

this.func1() или factory.func1() работа обоих.

+0

Это более общий вопрос AngularJS. Посмотрите видеоролики этой пары: https://www.youtube.com/playlist?list=PLoYCgNOIyGABI011EYc-avPOsk1YsMUe_ – tomepejo

ответ

0

Передовой опыт JS OOP предполагает, что factory.func1 предпочтительнее, когда func1 предполагается называть обратным вызовом с нелексическим this. В противном случае может использоваться this.func1.

В контексте модульного тестирования this.func1 является наилучшим вариантом, поскольку он не является жестко определенным для конкретной функции или объекта.

В контексте тестирования углового заводского обслуживания this.func1 и factory.func1 примерно эквивалентны.