2012-03-01 5 views
112

Yasemin için yeni ve yeni kullanmaya başladım. Herhangi bir nesne ile ilişkili olmayan birçok fonksiyona sahip bir kütüphane js dosyası var (yani, global). Bu işlevler hakkında casusluk yapmaya nasıl giderim?Bir nesneyi olmayan bir işlev üzerinde casusluk yapmak için Jasmine'i kullanma

Pencere/belgeyi nesne olarak kullanmayı denedim, ancak işlevin çağrılmasına rağmen casus çalışmadı.

var fakeElement = {}; 
fakeElement.fakeMethod = myFunctionName; 
spyOn(fakeElement, "fakeMethod"); 

ve

expect(fakeElement.fakeMethod).toHaveBeenCalled(); 

ile testi size işlevini tanımlıyorsanız casus

cevap

126

işe yaramadı gibi bu da işe yaramıyor şu şekildedir: Ben de sahte nesne sararak çalıştı :

: Sonra

function test() {}; 

, bu eşdeğerdir

spyOn(window, 'test') çalışmalıdır. Bunların hiçbiri çalışıyorsanız, başka bir şey Kurulumunuzda oluyor

test = jasmine.createSpy(); 

: Eğer olmasaydı

, ayrıca mümkün olmalıdır.

fakeElement teknik görüntülemenin arka planında ne iş yaptığından kaynaklandığını sanmıyorum. Orijinal globalMethod hala aynı koda işaret ediyor. Ne casusluk yapar, ancak sadece bir nesne bağlamında. Eğer test kodunuzu fakeElement üzerinden çağırırsanız, o zaman işe yarayacaktı, ancak o zaman global fns'i bırakabileceksiniz. o işlevi aslında bir sahte gibi görünüyor, çünkü

+1

İşe yaradı! Daha önce yaptığım hata, spyOn'u yöntem yerine method() ile çağırdığımdı. Teşekkürler! –

+2

"Pencere" nedeniyle tahsis edilmediğinden otomasyonumuzun bir parçası olarak testleri çalıştırmak için chutzpah kullanarak spyOn (window, 'test') kullanarak bazı sorunlar yaşadım. Jasmine.createSpy() kullanımı bunu aştı. – Henners

+5

jasmine.createSpy() benim için mükemmel çalıştı. Teşekkürler! – dplass

36

I (yasemin 2 için) kullanan 2 alternatif

Bu seferki oldukça açık değildir yoktur.

test = createSpy().and.callFake(test); 

ikinci ve daha ayrıntılı daha açık ve "daha temiz":

test = createSpy('testSpy', test).and.callThrough(); 

->jasmine source code ikinci argüman bkz

+0

Bu biraz daha mantıklı ve başarı ile çoğaltmak için yeterince uzak keser. +1 benden. Teşekkürler, C§ – CSS

22

typescript kullanıcıları için: Biliyorum

OP javascript hakkında sordu, ancak ithal edilen bir fonksiyon üzerinde casusluk yapmak isteyen herkese karşı gelen tüm TypeScript kullanıcıları için yapabilirsin.Test dosyasında

, bundan fonksiyonun ithalat dönüştürmek:

import {foo} from '../foo_functions'; 

x = foo(y); 

Bu Kime:

import * as FooFunctions from '../foo_functions'; 

x = FooFunctions.foo(y); 

Sonra FooFunctions.foo :)

spyOn(FooFunctions, 'foo').and.callFake(...); 
// ... 
expect(FooFunctions.foo).toHaveBeenCalled(); 
+2

TypeScript ipucu için teşekkürler. Aynı şekilde ES6/Babel için aynı olmalıdır, ama denemedim. – hgoebl

+0

Sadece işlevin ** açıkça FooFunctions ** takma adıyla çağrılması durumunda çalışır gibi görünüyor. Bir fabrikada baz() dönen bir fabrika var() ve bu baz() foo() çağrılarını test etmek istiyorum. Bu yöntem, bu senaryoda çalışma görünmüyor. takma foo_functions içinde alınmış olup olmadığını –

+1

Bu çalışır 'ihracat const FooFunctions = {çubuğu foo};' ve test içe Ancak foo_functions'.' ../ 'den 'içe {FooFunctions} olur Ayrıca, takma adın çalışabilmesi için takma adın özel bir uygulamada açık bir şekilde kullanılması gerekir. 'const result = FooFunctions.foo (params)' // casus raporları ara 'const sonucu = foo (params)' // casus arama bildirmiyor –

-1

gizlice izleyebilir pencereyi tanımlamaksızın mümkün olmalıdır. küresel işlev. Deneyin:

var x = function() {} 

    spyX = spyOn(x, 'call') // 

    // something, that calls x 
    expect(spyX).toBeCalled() 
3

Çok basit bir yol:

import * as myFunctionContainer from 'whatever-lib'; 

const fooSpy = spyOn(myFunctionContainer, 'myFunc');