तर्कों के आधार पर जैस्मीन जासूसों को संशोधित करने का कोई तरीका?


146

मेरे पास एक फ़ंक्शन है जो मैं परीक्षण करना चाहूंगा जो विभिन्न मापदंडों का उपयोग करके दो बार एक बाहरी एपीआई विधि को कॉल करता है। मैं इस बाहरी एपीआई को जैस्मिन जासूस के साथ मॉक करना चाहता हूं, और मापदंडों के आधार पर अलग-अलग चीजें लौटाता हूं। क्या जैस्मिन में ऐसा करने का कोई तरीका है? सबसे अच्छा मैं एक हैक का उपयोग कर के साथ आ सकता है:

var functionToTest = function() {
  var userName = externalApi.get('abc');
  var userId = externalApi.get('123');
};


describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').andCallFake(function(myParam) {
      if (myParam == 'abc') {
        return 'Jane';
      } else if (myParam == '123') {
        return 98765;
      }
    });
  });
});

जवाबों:


213

जैस्मीन संस्करण 3.0 और इसके बाद के संस्करण में आप उपयोग कर सकते हैं withArgs

describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get')
      .withArgs('abc').and.returnValue('Jane')
      .withArgs('123').and.returnValue(98765);
  });
});

3.0 से पहले के जैस्मीन संस्करणों के callFakeलिए जाने का सही तरीका है, लेकिन आप रिटर्न वैल्यूज़ को होल्ड करने के लिए ऑब्जेक्ट का उपयोग करके इसे सरल बना सकते हैं

describe('my fn', function() {
  var params = {
    'abc': 'Jane', 
    '123': 98765
  }

  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').and.callFake(function(myParam) {
     return params[myParam]
    });
  });
});

जैस्मीन के संस्करण के आधार पर, वाक्यविन्यास थोड़ा अलग है:

  • 1.3.1: .andCallFake(fn)
  • 2.0: .and.callFake(fn)

संसाधन:


11
यह अब है and.callFake- jasmine.github.io/2.2/… >
लुसी बैन

मुझे अलग-अलग वादे लौटाने थे, इसलिए रिटर्न थोड़ा अलग था: वापसी q.when (params [myParam]) ;। अन्यथा, यह मेरी समस्या के समाधान पर एक स्पॉट था। मेरा स्वप्न समाधान "and.returnValue" कॉल को बदलना होगा।
बिल टर्नर

7
ऐसा लगता है कि चमेली को इसे घोषित करने का एक बेहतर तरीका होना चाहिए। जैसा spyOn(fake, 'method').withArgs('abc').and.returnValue('Jane')और spyOn(fake, 'method').withArgs('123').and.returnValue(98765)
जहरथथ

@ जसरथ .withArgs2.0 में मेरे लिए काम नहीं कर रहा है
हेमकरन_राघव

1
.withArgsवास्तव में उपलब्ध नहीं है - मेरा मतलब था कि परीक्षण लिखते समय इस तरह की विधि समझ में आती है।
j:

9

आप $provideएक जासूस बनाने के लिए भी इस्तेमाल कर सकते हैं । और पैरामीटर डेटा में पास करने के and.returnValuesबजाय मॉक का उपयोग and.returnValueकरें।

जैस्मिन डॉक्स के अनुसार: स्पाई को चैन and.returnValuesकरने से, फंक्शन की सभी कॉलें विशिष्ट मान लौटाएंगी, जब तक कि यह रिटर्न वैल्यू लिस्ट के अंत तक नहीं पहुंच जाती है, इस बिंदु पर यह बाद की सभी कॉल्स के लिए अपरिभाषित हो जाएगी।

describe('my fn', () => {
    beforeEach(module($provide => {
        $provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get']));
    }));

        it('get userName and Id', inject((externalApi) => {
            // Given
            externalApi.get.and.returnValues('abc','123');

            // When
            //insert your condition

            // Then
            // insert the expectation                
        }));
});

यह सही उत्तर है, क्योंकि एक परीक्षण को हमेशा यह जानना चाहिए कि जासूस को कैसे बुलाया जाएगा, और इसलिए उसे returnValuesकई कॉल का समर्थन करने के लिए उपयोग करना चाहिए
श्मुली

2
बस अकोरी के जवाब को स्पष्ट करने के लिए: यह विधि केवल तब काम करती है जब फ़ंक्शन के externalApi.get.and.returnValues('abc','123')भीतर बुलाया जाता है it। अन्यथा यदि आप मानों की सूची सेट करते हैं, तो और कहाँ, यह कभी काम नहीं करेगा क्योंकि परीक्षण जिस क्रम में चलाए जा रहे हैं वह अनुमानित नहीं है। वास्तव में परीक्षणों को उस क्रम पर निर्भर नहीं होना चाहिए जिसमें वे निष्पादित होते हैं।
avi.elkharrat

0

मेरे मामले में, मेरे पास एक घटक था जो मैं परीक्षण कर रहा था और, इसके निर्माता में, एक विधि है जिसमें getAppConfigValue नामक एक विधि है जिसे दो बार कहा जाता है, प्रत्येक बार अलग-अलग तर्क के साथ:

constructor(private configSvc: ConfigService) {
  this.configSvc.getAppConfigValue('a_string');
  this.configSvc.getAppConfigValue('another_string');
}

मेरी कल्पना में, मैंने टेस्टबेड में कॉन्फिगरेशन इस तरह प्रदान किया:

{
  provide: ConfigService,
  useValue: {
    getAppConfigValue: (key: any): any {
      if (key === 'a_string) {
        return 'a_value';
      } else if (key === 'another_string') {
        return 'another_value';
      }
    }
  } as ConfigService
}

तो, जब तक getAppConfigValue के लिए हस्ताक्षर वास्तविक कॉन्फिगर सेवा में निर्दिष्ट है, तब तक फ़ंक्शन क्या आंतरिक रूप से संशोधित किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.