2013-02-12 31 views
46

Tôi đã xem xét tài liệu của Jasmine về bộ đối sánh toHaveBeenCalledWith để hiểu xem nó có thể chuyển sang biểu thức chính quy cho một đối số hay không, nếu đối số đó được mong đợi là một chuỗi. Thật không may, đây là chức năng không được hỗ trợ. Ngoài ra còn có một số issue open on github yêu cầu chức năng này.Có thể sử dụng trình ghép nối toHaveBeenCalledWith của Jasmine với cụm từ thông dụng không?

Tôi đã đào một chút vào cơ sở mã và tôi thấy cách thực hiện điều này bên trong existing matcher. Tôi nghĩ rằng sẽ thích hợp hơn nếu thực hiện nó như một trình kết nối riêng biệt, để cho sự trừu tượng được bắt riêng lẻ.

Trong thời gian chờ đợi, giải pháp nào có thể là giải pháp tốt?

Trả lời

68

Sau khi thực hiện một số thao tác, tôi đã phát hiện ra rằng đối tượng Jasmine spy có thuộc tính calls, lần lượt có chức năng mostRecent(). Hàm này cũng có thuộc tính con args, trả về một mảng đối số cuộc gọi.

Do đó, người ta có thể sử dụng trình tự sau đây để thực hiện một trận đấu regexp trên đối số cuộc gọi, khi ai muốn kiểm tra xem các đối số chuỗi phù hợp với một biểu thức chính quy cụ thể:

var mySpy = jasmine.createSpy('foo'); 
mySpy("bar", "baz"); 
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/); 

Khá đơn giản.

11

Ngoài ra, nếu bạn đang gián điệp trên một phương pháp trên một đối tượng:

spyOn(obj, 'method'); 
obj.method('bar', 'baz'); 
expect(obj.method.argsForCall[0][0]).toMatch(/bar/); 
expect(obj.method.argsForCall[0][1]).toMatch(/baz/); 
+5

Trong Jasmine 2.0, cú pháp sẽ là 'obj.method.calls.argsFor (index)', vẫn là một mảng. – Dr1Ku

21

Trong Jasmine 2.0 signature changed a bit. Dưới đây là:

var mySpy = jasmine.createSpy('foo'); 
mySpy("bar", "baz"); 
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/); 

Documentation for Jasmine 1.3 đã di chuyển.

6

Như jammon đã đề cập, chữ ký Jasmine 2.0 đã thay đổi. Nếu bạn đang gián điệp vào phương pháp của một đối tượng trong Jasmine 2.0, giải pháp của Nick nên được thay đổi để sử dụng một cái gì đó giống như -

spyOn(obj, 'method'); 
obj.method('bar', 'baz'); 
expect(obj.method.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(obj.method.calls.mostRecent().args[1]).toMatch(/baz/); 
2

Đôi khi nó là dễ đọc hơn để viết nó theo cách này:

spyOn(obj, 'method').and.callFake(function(arg1, arg2) { 
    expect(arg1).toMatch(/bar/); 
    expect(arg2).toMatch(/baz/); 
}); 
obj.method('bar', 'baz'); 
expect(obj.method).toHaveBeenCalled(); 

Nó cung cấp cho tầm nhìn rõ ràng hơn của các đối số phương pháp (thay vì sử dụng mảng)

3

Tính đến Jasmine 2.2, bạn có thể sử dụng jasmine.stringMatching:

var mySpy = jasmine.createSpy('foo'); 
mySpy('bar', 'baz'); 
expect(mySpy).toHaveBeenCalledWith(
    jasmine.stringMatching(/bar/), 
    jasmine.stringMatching(/baz/) 
); 
Các vấn đề liên quan