วิธีรับค่าตอบแทนที่แตกต่างกันสำหรับการโทรหลายครั้งกับสายลับจัสมิน


105

สมมติว่าฉันกำลังสอดแนมวิธีการเช่นนี้:

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

ฟังก์ชันภายใต้การทดสอบเรียกutil.fooใช้หลายครั้ง

เป็นไปได้ไหมที่จะให้สายลับกลับมาtrueในครั้งแรกที่ถูกเรียก แต่กลับfalseครั้งที่สอง? หรือมีวิธีอื่นที่จะไปเกี่ยวกับเรื่องนี้?

คำตอบ:


173

คุณสามารถใช้spy.and.returnValues (เช่น Jasmine 2.4)

ตัวอย่างเช่น

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();
  });
});

มีบางสิ่งที่คุณจะต้องระมัดระวังเกี่ยวกับการเป็นที่มีฟังก์ชั่นอื่นจะสะกดคล้ายกันreturnValueโดยไม่ได้sถ้าคุณใช้ว่ามะลิจะไม่เตือนคุณ


22
+1: นี่เป็นคุณสมบัติที่ยอดเยี่ยม คำเตือนแม้ว่า - ต้องระวังไม่ให้ลืม 's' ใน.returnValues- ทั้งสองฟังก์ชั่นที่แตกต่างกันอย่างเห็นได้ชัด แต่ผ่านการขัดแย้งหลายที่จะ.returnValueไม่โยนความผิดพลาด ฉันไม่อยากยอมรับว่าฉันเสียเวลาไปเท่าไหร่เพราะตัวละครตัวนั้น
The DIMM Reaper

@TheDIMMReaper ขอบคุณครับ ฉันพูดถึงมันตอนนี้
มหาสมุทร

การทำก่อนหน้านี้แต่ละอย่างสำคัญสำหรับฉันไม่ใช่ในการทดสอบ (มัน)
เอียน

ไม่ต้องกังวลกับการสะกดผิดเมื่อใช้ดอกมะลิใน TypeScript แน่นอน
Warlike Chimpanzee

28

สำหรับจัสมินเวอร์ชันเก่าคุณสามารถใช้spy.andCallFakeกับจัสมิน 1.3 หรือspy.and.callFakeจัสมิน 2.0 ได้และคุณจะต้องติดตามสถานะ 'เรียก' ไม่ว่าจะผ่านการปิดแบบธรรมดาหรือคุณสมบัติอ็อบเจ็กต์เป็นต้น

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

4
เราสามารถขยายสิ่งนี้ได้มากกว่า 2 การเรียกดังนี้: var results = [true, false, "foo"]; var callCount = 0; spyOn (util, "foo"). and.callFake (ฟังก์ชัน () {ส่งคืนผลลัพธ์ [callCount ++];});
แจ็ค

1
สิ่งนี้สามารถขยายเป็นฟังก์ชันทั่วไปได้ดังนี้ function returnValues ​​() {var args = arguments; var callCount = 0; ฟังก์ชัน return () {return args [callCount ++]; }; }
Tomas Lieberkind

ทำไมต้องใช้รหัสนี้ทั้งหมดเมื่อคุณสามารถส่งคืน results.shift () ได้
ThaFog

เมื่อเรากลับ
Lijo

ตัวเลือกนี้มีความยืดหยุ่นมากขึ้นเนื่องจากเราสามารถโยนข้อผิดพลาดหรือส่งคืนค่าขึ้นอยู่กับลำดับการโทร
0bj3ct
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.