2012-01-19 5 views
36

Jak symulować obiekt okna? Robię rozszerzenie firefox i chcę używać jaśminu do testowania javascript.obiekt okna jaśminu

W moim javascript Mam

 

function submit() { 
... 
var url = window.arguments[0]; 
... 
} 
 

Oczywiście, muszę kpić window.arguments [0] w jaśminu dlatego, że obiekt nie istnieje, jeżeli nie przechodząc każdy parametr z window.openDialog

to moja próba wyśmiewać go „z”

 

it("should submit to server", function() { 

     var localContext = { 
      "window": { 
       arguments: ["http://localhost"] 
      } 

     } 

     with(localContext); 
 

Ale wciąż otrzymuję ten błąd TypeError: nie można odczytać właściwość „0” undefined, to jak wtedy, gdy badanie przeprowadzane jest windo w.arguments [0] zostanie wymazane z prawdziwym oknem, bo jeśli ja

window.arguments[0]

wewnątrz testu, to wypisuje "http: // localhost" poprawnie. ale jeśli chodzi o metodę submit(), pokazuje błąd, że argument window.argument jest niezdefiniowany.

Odpowiedz

52

Problem polega na tym, że wystarczy nadpisać właściwość obiektu okna. A jeśli możesz to zrobić, przeglądarka może to również zrobić. Zatem kpiny z funkcji lub własności globalnego obiektu, do których każdy ma dostęp, nie są dobrym pomysłem, ponieważ nigdy nie możesz być pewny, że twoje zmiany będą obecne podczas próby uzyskania do nich dostępu.

Co prowadzi mnie do dependency injection. Jest to wspólny wzorzec, dzięki któremu jednostka kodu może być testowana, ze szczególnym naciskiem na jednostkę unit. Co to znaczy. Kiedy tworzysz nowy obiekt lub uzyskujesz dostęp do obiektu globalnego, testujesz nie tylko swoją jednostkę, ale także funkcjonalność nowo utworzonego lub globalnego obiektu. Aby to zrobić, nie twórz nowych obiektów w jednostce , ale przekaż je do. Zwykle chciałbyś to zrobić w konstruktorze, ale tak jak w funkcji JavaScript są obiekty z ciałem funkcji jako konstruktorem, możesz także przekazać zależności po prostu do swojej funkcji.

Tak więc w twoim przypadku funkcja zależy od globalnego obiektu okna. Dlatego zamiast próbować uzyskać dostęp do globalnego obiektu okna, przekaż go jako parametr do swojej funkcji. Robi to w ten sposób można przekazać w obiekcie okna w kodzie produkcyjnym i prostego obiektu JavaScript z argumentów atribute do testu:

function youWannaTest(w){ 
    console.log(w.arguments[0]); 
} 

w rozszerzeniu wywołać funkcję tak:

youWannaTest(window); 

w wywołaniu testu funkcja tak:

youWannaTest({arguments: ['someValue']}); 
+0

Dzięki za odpowiedź, więc nie mogę się wyśmiewać, że? – toy

+0

Zaktualizowałam moją odpowiedź, aby uczynić punkt nieco jaśniejszym. –

1

myślę też zależność wtrysku jest najczystszym rozwiązanie.

Twoje JS:

function submit(_window) { 
    _window = _window || window 
    ... 
    var url = _window.arguments[0]; 
    ... 
} 

Twoje testy jednostkowe:

it('works like a dream', function() { 
    var _window = { arguments: ['url'] } 
    expect(submit(_window)).toBeTotallyAwesome() 
}) 
0

Tak, można drwić okien obiektu.

Pierwszą rzeczą, którą musisz zrobić to zrobić jedną zmianę w kodzie JS: Wymień okno z $ oknie.

Następnie można drwić okno za pomocą poniższego kodu:

var window = { 
    arguments : ['url'] 
}; 

Teraz w swoim pliku spec: w beforeEach zablokować

$controller('controllerName', {$window : window});