Cách có các giá trị trả về khác nhau cho nhiều cuộc gọi trên gián điệp Jasmine


100

Giả sử tôi đang theo dõi một phương pháp như thế này:

spyOn(util, "foo").andReturn(true);

Hàm đang thử nghiệm gọi util.foonhiều lần.

Có thể để điệp viên quay lại truelần đầu tiên được gọi, nhưng quay lại falselần thứ hai? Hay có một cách khác để giải quyết vấn đề này?

Câu trả lời:


163

Bạn có thể sử dụng spy.and.returnValues (như Jasmine 2.4).

ví dụ

describe("A spy, when configured to fake a series of return values", function() {
  beforeEach(function() {
    spyOn(util, "foo").and.returnValues(true, false);
  });

  it("when called multiple times returns the requested values in order", function() {
    expect(util.foo()).toBeTruthy();
    expect(util.foo()).toBeFalsy();
    expect(util.foo()).toBeUndefined();
  });
});

Có một số điều bạn phải cẩn thận, có một chức năng khác sẽ tương tự như câu thần chú returnValuemà không có s, nếu bạn sử dụng nó, hoa nhài sẽ không cảnh báo bạn.


20
+1: đây là một tính năng tuyệt vời. Tuy nhiên, một lời cảnh báo - hãy cẩn thận đừng quên 's' in .returnValues- hai hàm rõ ràng là khác nhau, nhưng việc chuyển nhiều đối số để .returnValuekhông gây ra lỗi. Tôi không muốn thừa nhận rằng tôi đã lãng phí bao nhiêu thời gian vì một nhân vật đó.
The DIMM Reaper

@TheDIMMReaper, Cảm ơn bạn. Tôi đề cập đến nó bây giờ.
Ocean

Làm điều đó trước đâyMỗi điều quan trọng đối với tôi, không phải trong bài kiểm tra (nó)
Ian

Tất nhiên, không cần phải lo lắng về lỗi chính tả khi sử dụng jasmine trong TypeScript.
Chimpanzee hiếu chiến vào

27

Đối với các phiên bản cũ hơn của Jasmine, bạn có thể sử dụng spy.andCallFakecho Jasmine 1.3 hoặc spy.and.callFakeJasmine 2.0 và bạn sẽ phải theo dõi trạng thái 'được gọi', thông qua một đóng đơn giản hoặc thuộc tính đối tượng, v.v.

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});

4
Chúng ta có thể mở rộng điều này cho nhiều hơn 2 cuộc gọi như sau: var results = [true, false, "foo"]; var callCount = 0; spyOn (dùng, "foo"). and.callFake (function () {trả về kết quả [callCount ++];});
Jack

1
Điều này có thể được mở rộng thành một hàm chung chung như sau: function returnValues ​​() {var args = objects; var callCount = 0; hàm return () {return args [callCount ++]; } }
Tomas Lieberkind vào

Tại sao toàn bộ mã này khi bạn chỉ có thể trả về results.shift ()?
ThaFog

còn khi chúng tôi quay lại các đài quan sát thì sao
Lijo

tùy chọn này linh hoạt hơn, vì chúng tôi có thể ném lỗi hoặc trả về giá trị tùy thuộc vào lệnh gọi.
0bj3ct
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.