Powiedz, że mam następujący JavaScript:

function Foo() {

    function privateStuff() {
       //do private stuff
    }

    this.publicStuff = function() {
        privateStuff();
        //do other stuff
    }

}

Jest wystarczająco łatwy do przetestowania publicStuff(), wykonując następujące czynności:

var myFoo = new Foo();
myFoo.publicStuff();
//all the assertions

Chcę jednak być w stanie przetestować metodę privateStuff() jako własną jednostkę. Nie jestem pewien, jak mógłbym zadzwonić do tego, to jest własne. Wiem z Java (z którym jestem znacznie bardziej znajomy), możesz użyć refleksji do przetestowania prywatnych metod, ale zastanawiam się, czy jest jakiś sposób, aby przetestować te funkcje samodzielnie. Jeśli nie ma ogólnego sposobu na to, zacząłem grać z jaśmin uruchomić testy moich jednostek . Czy te ramy zapewniają to jakąkolwiek możliwość?

4
dnc253 23 sierpień 2012, 08:07

2 odpowiedzi

Najlepsza odpowiedź

Sposób, w jaki tam masz swój kod, nie możesz. Nie pozwalasz niczego, aby uzyskać dostęp do privateStuff. Wydaje mi się, że musisz czytać na koncepcji zamknięć (co ma fundamentalne dla JavaScript).

Za każdym razem, gdy używasz konstrukcji f() { ... } w JS (i kilku innych, takich jak try-catch bloki), zawsze domyślnie utwórz zamknięcie. Funkcje zagnieżdżania Jak to zrobiłeś, jest doskonale legalne, ale chyba że podajesz funkcję zewnętrzną Zewnętrzne odniesienie do funkcji wewnętrznej, funkcja wewnętrzna może być dostęp tylko z funkcji zewnętrznej.

Z Mozilla:

Możesz zagnieżdżać funkcję w funkcji. Funkcja zagnieżdżona (wewnętrzna) jest prywatna do jego funkcji zawierającej (zewnętrzna). Tworzy również zamknięcie.

Zamknięcie jest wyrażeniem (zazwyczaj funkcją), która może mieć wolne zmienne wraz ze środowiskiem, który wiąże te zmienne (że "zamyka" wyrażenie).

Ponieważ zagnieżdżona funkcja jest zamknięciem, oznacza to, że zagnieżdżona funkcja może "dziedziczyć" argumenty i zmienne funkcji zawierającej. Innymi słowy, funkcja wewnętrzna zawiera zakres funkcji zewnętrznej.

  • Dostęp do funkcji wewnętrznej można uzyskać tylko z instrukcji w funkcji zewnętrznej.
  • Wewnętrzna funkcja tworzy zamknięcie: funkcja wewnętrzna może korzystać z argumentów i

Nawet jeśli dokumentacja Mozilli utrwala to, jest nieco niepoprawne do powiedzenia rzeczy jest private lub public w JavaScript, ponieważ nomenklatura ma bardzo dobrze określone znaczenie w większości języków programowania (jak C ++ i Java), który dotyczy zachowanie polimorficzne lub dziedzictwo. Jeśli chodzi o JS, lepiej jest myśleć o tym jako zakres ograniczonego zakresu i starać się uzyskać silne zrozumienie zamknięć.

2
David Titarenco 23 sierpień 2012, 04:30

Nie możesz tego zrobić z zewnątrz, dlatego jest "prywatny". Możesz tymczasowo narażać go:

this.privateStuff = privateStuff;

Lub wykonaj testy od wewnątrz zakresu, jeśli to możliwe, jednak testujesz go ...

1
Ry- 23 sierpień 2012, 04:14