যুক্তির ভিত্তিতে জেসমিন গুপ্তচরকে সংশোধন করার কোনও উপায়?


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হ'ল সঠিক উপায়, তবে আপনি রিটার্ন মানগুলি ধরে রাখতে কোনও অবজেক্টটি ব্যবহার করে এটি সহজ করতে পারেন can

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 (প্যারামস [মাইপ্রাম]) ;. অন্যথায়, এটি আমার সমস্যার সমাধানের জায়গা। আমার স্বপ্নের সমাধানটি "এবং.রেটওয়ালিউ" কলগুলি পরিবর্তন করা হবে।
বিল টার্নার

7
জুঁইয়ের কাছে এটির घोषणा করার আরও ভাল উপায় হওয়া উচিত বলে মনে হয়। লাইক spyOn(fake, 'method').withArgs('abc').and.returnValue('Jane')এবং spyOn(fake, 'method').withArgs('123').and.returnValue(98765)
jrharshath

@jrharshath .withArgsআমার জন্য জুঁই ২.০ তে কাজ করছে না
হেমকরন_রাঘব

1
.withArgsসত্যিই উপলভ্য নয় - আমি বোঝাতে চেয়েছিলাম যে পরীক্ষাগুলি লেখার সময় এই জাতীয় পদ্ধতিটি বোধগম্য হয়।
jrharshath

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 এর স্বাক্ষর প্রকৃত কনফিগারেশনগুলিতে উল্লিখিত হিসাবে একই থাকে তবে অভ্যন্তরীণভাবে ফাংশনটি কী করে তা সংশোধন করা যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.