2012-03-01 24 views
112

Tôi mới sử dụng Jasmine và mới bắt đầu sử dụng nó. Tôi có một tập tin thư viện js với rất nhiều chức năng không liên kết với bất kỳ đối tượng nào (tức là toàn cầu). Làm cách nào để tìm hiểu về các chức năng này?Sử dụng Jasmine để dò tìm chức năng không có đối tượng

Tôi đã thử sử dụng cửa sổ/tài liệu làm đối tượng, nhưng gián điệp không hoạt động ngay cả khi chức năng được gọi. Tôi cũng cố gắng gói nó trong một đối tượng giả như sau:

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

và thử nghiệm với

expect(fakeElement.fakeMethod).toHaveBeenCalled(); 

này không làm việc, hoặc là gián điệp đã không làm việc

Trả lời

126

Nếu bạn đang xác định chức năng của bạn :

function test() {}; 

Sau đó, điều này tương đương với:

window.test = function() {} /* (in the browser) */ 

Vì vậy, spyOn(window, 'test') sẽ hoạt động.

Nếu đó không phải là, bạn cũng sẽ có thể:

test = jasmine.createSpy(); 

Nếu không ai trong số những người đang làm việc, cái gì khác đang xảy ra với thiết lập của bạn.

Tôi không nghĩ kỹ thuật fakeElement của bạn hoạt động vì những gì đang diễn ra đằng sau hậu trường. GlobalMethod ban đầu vẫn trỏ đến cùng một mã. Điều gián điệp là proxy nó, nhưng chỉ trong ngữ cảnh của một đối tượng. Nếu bạn có thể nhận được mã thử nghiệm của bạn để gọi thông qua fakeElement nó sẽ làm việc, nhưng sau đó bạn sẽ có thể từ bỏ fns toàn cầu.

+1

Nó làm việc! Tôi nghĩ rằng lỗi tôi đã làm trước đó là tôi đã gọi spyOn với phương thức() thay vì phương pháp. Cảm ơn! –

+2

Tôi đã có một số vấn đề bằng cách sử dụng spyOn (cửa sổ, 'kiểm tra') bằng cách sử dụng chutzpah để chạy các bài kiểm tra như là một phần của tự động hóa của chúng tôi do 'cửa sổ' không được chỉ định. Sử dụng jasmine.createSpy() đã giải quyết vấn đề này. – Henners

+5

jasmine.createSpy() hoạt động hoàn hảo cho tôi. Cảm ơn! – dplass

36

Có 2 lựa chọn mà tôi sử dụng (đối với hoa nhài 2)

Cái này không phải là khá rõ ràng vì nó có vẻ rằng chức năng thực sự là một giả.

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

Thứ hai tiết hơn, rõ ràng hơn, và "sạch":

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

->jasmine source code để xem đối số thứ hai

+0

Điều này có ý nghĩa hơn một chút và phá vỡ nó đủ xa để nhân đôi thành công. +1 từ tôi. Cảm ơn, C§ – CSS

22

người dùng đánh máy:

tôi biết OP hỏi về javascript, nhưng đối với bất kỳ người dùng TypeScript nào gặp phải điều này, người muốn theo dõi chức năng được nhập, đây là bạn có thể làm.

Trong tập tin kiểm tra, chuyển đổi việc nhập khẩu của hàm từ này:

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

x = foo(y); 

Để này:

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

x = FooFunctions.foo(y); 

Sau đó, bạn có thể do thám FooFunctions.foo :)

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

Cảm ơn gợi ý TypeScript. Nên được như nhau cho ES6/Babel, nhưng tôi đã không thử nó. – hgoebl

+0

Dường như nó chỉ hoạt động nếu gọi hàm ** một cách rõ ràng với bí danh FooFunctions **. Tôi có một thanh chức năng() đó là một nhà máy trở lại baz() và muốn kiểm tra baz() gọi foo(). Phương pháp này dường như không hoạt động trong trường hợp đó. –

+1

này sẽ hoạt động nếu bí danh được lấy bên foo_functions 'xuất khẩu const FooFunctions = {bar, foo}; ' và nhập khẩu trong các thử nghiệm trở nên ' nhập {} FooFunctions từ' ../ foo_functions'.' Tuy nhiên , bí danh vẫn cần phải được sử dụng một cách rõ ràng trong foo_functions việc triển khai cá nhân để gián điệp hoạt động. 'const result = FooFunctions.foo (params)' // spy reports gọi 'const result = foo (params)' // spy report không gọi –

-1

nó phải có thể mà không cần xác định cửa sổ. chức năng toàn cầu. Hãy thử:

var x = function() {} 

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

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

Một cách rất đơn giản:

import * as myFunctionContainer from 'whatever-lib'; 

const fooSpy = spyOn(myFunctionContainer, 'myFunc'); 
Các vấn đề liên quan