জেসমিনের সাথে কীভাবে কোনও মূল্য সম্পত্তি (কোনও পদ্ধতির চেয়ে) স্পাইঅন করবেন


115

জেসমিনের spyOnকোনও পদ্ধতির আচরণ পরিবর্তন করা ভাল তবে কোনও জিনিসের জন্য কোনও মান সম্পত্তি (পদ্ধতি পরিবর্তে) পরিবর্তন করার কোনও উপায় আছে কি? কোড নীচের মত হতে পারে:

spyOn(myObj, 'valueA').andReturn(1);
expect(myObj.valueA).toBe(1);

উত্তর:


97

ফেব্রুয়ারী 2017 এ, তারা এই বৈশিষ্ট্য যুক্ত করে একটি পিআর একীভূত করেছে, এপ্রিল 2017 এ তারা প্রকাশ করেছে।

সুতরাং আপনি ব্যবহারকারীদের / const spy = spyOnProperty(myObj, 'myGetterName', 'get'); সেটটারগুলিতে গুপ্তচরবৃত্তি করতে: যেখানে মাইওবিজে আপনার উদাহরণ, সেখানে 'মাইগেটেরনাম' আপনার শ্রেণিতে যেমন সংজ্ঞায়িত হয়েছে তার নাম get myGetterName() {}এবং তৃতীয় পরম টাইপ getবা set

আপনি ইতিমধ্যে যে গুপ্তচর তৈরি করেছেন তাদের সাথে একই অনুরোধগুলি ব্যবহার করতে পারেন spyOn

সুতরাং আপনি উদাহরণস্বরূপ করতে পারেন:

const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.

এখানে গিথুব উত্স কোডের লাইনটি যেখানে আপনি যদি আগ্রহী হন তবে এই পদ্ধতিটি উপলব্ধ।

https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199

আসল প্রশ্নের উত্তর, জুঁই ২..1.১ সহ, আপনি যা করবেন:

const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();

7
আমি এটা কিভাবে করব যদি valueAএকটি Observableবা Subject? আমি পাচ্ছিProperty valueA does not have access type get
কা মোক

4
এর অর্থ সম্ভবত আপনি এটি সেই সম্পত্তিটিতে ব্যবহার করতে পারবেন না। গুপ্তচরনপ্রপার্টি getOwNPropertyDescriptor ব্যবহার করছে এবং সেই সম্পত্তি বর্ণনাকারীর জন্য অ্যাক্সেস টাইপ পেয়েছে কিনা সেটিং পরীক্ষা করছে। আপনি যে ত্রুটিটি পাচ্ছেন তা হ'ল সম্পত্তির বর্ণনাকারী সেট করা হয়নি বা আপনি যে সম্পত্তিটি গুপ্তচর চেষ্টা করছেন তার জন্য পান। জুঁই এটি করে: কনস্ট ডেস্ক্রিপ্টর = অবজেক্ট.জেটআপনিপ্রপার্টিডেস্কিটার ... যদি (! বর্ণনাকারী [অ্যাক্সেসটাইপ]) {// ত্রুটি নিক্ষেপ করা হয়}
জুয়ান

সুতরাং, সুস্পষ্ট গেটর এবং সেটার পদ্ধতি ছাড়াই কোনও সম্পত্তি গুপ্তচর করার কোনও উপায় নেই? গুপ্তচরবৃত্তি করা সম্পত্তি হিসাবে ব্যবহৃত হয়।
ডোমিনিক

: @Dominik এখানে আমি সব একটি লম্বা প্রবন্ধে এই সংক্রান্ত ফণা কাপড় অধীনে লিখেছিলেন medium.com/@juanlizarazo/...
জুয়ান

1
@ ম্যাথিউ এটি একটি ভাল জোর দেওয়া হয়নি কারণ এটি গুপ্তচরকে আমরা যা করতে বলেছিলাম তা থেকে আমরা ইতিমধ্যে যা জানি তা কেবল এটিই জোর করে, তবে তারা যা জিজ্ঞাসা করেছিল এবং এটি তাদের একই প্রশ্ন কোড স্নিপেট ¯_ (ツ) _ / ¯ মূল বিষয় তাদের প্রশ্ন ছিল কীভাবে কোনও সম্পত্তির গুপ্তচরবৃত্তি করা যায় এবং তার নির্দিষ্ট উদাহরণটি এতটা না।
জুয়ান

12

কোনও কারণে আপনি কেবল এটি সরাসরি অবজেক্টে পরিবর্তন করতে পারবেন না? এটি জাভাস্ক্রিপ্ট কোনও বস্তুর কোনও সম্পত্তির দৃশ্যমানতার জন্য বল প্রয়োগ করে না।


1
spyOnস্পষ্টভাবে ব্যবহার করা ইঙ্গিত দেয় যে আমি কিছু উপহাস করতে চাই, যখন আমি সরাসরি সম্পত্তি সেট করে দিয়েছিলাম যে আমি কিছু উপহাস করতে চাই এবং আমি নিশ্চিত নই যে কোডটি পড়ার সময় অন্য কেউ বুঝতে পারবেন যে আমি কিছু উপহাস করছি। মামলার অন্য যে আমি বস্তুর ভেতরের আচরণ পরিবর্তন, উদাহরণস্বরূপ যদি আমি একটি অ্যারের জন্য দৈর্ঘ্য সম্পত্তি পরিবর্তন করেন, অ্যারে ছাঁটা হয়, তাই একটি উপহাস ভাল হবে না চাই
Shuping

@ শুপিং, এই ক্ষেত্রে আপনি বিদ্রূপ করবেন না। আপনি স্ট্যাবিড যা পুরোপুরি ঠিক আছে। আপনি কেবলমাত্র পরীক্ষার অভ্যন্তরে "আচরণ পরিবর্তন করছেন" যা আপনি এটির সাথে অর্জন করার চেষ্টা করছিলেন spyOn
ফ্যাবিও মিলহিরো

সম্ভবত রানটাইম অবজেক্টের প্রোটোটাইপটিতে গুপ্তচরবৃত্তি করতে চান তা নিশ্চিত করার জন্য সম্পত্তি রানটাইমের সময় উপস্থিত থাকবে exist spyOnসম্পত্তি উপস্থিত না থাকলে জুঁই পরীক্ষাতে ব্যর্থ হয়।
সিনেটটি

2
একটি উদাহরণ TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
উইন্ডো.অ্যাসিওশন স্টোরেজ

2
জাভাস্ক্রিপ্টে কোনও বস্তুর সম্পত্তি পুনরায় অর্পণ করা সবসময়ই সম্ভব নয়
রেনেউদ

12

জুঁইয়ের সেই কার্যকারিতা নেই তবে আপনি একসাথে কিছু ব্যবহার করতে হ্যাক করতে সক্ষম হতে পারেন Object.defineProperty

গেটর ফাংশনটি ব্যবহার করার জন্য আপনি আপনার কোডটি রিফ্যাক্টর করতে পারেন, তারপরে গেটারের সন্ধান করুন।

spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);

হ্যাঁ, আমি এখনই এটি করতে পারি।
Shuping

4
জুঁই 2 এর জন্য এটি:and.returnValue(1)
জেটজারো

9

সবচেয়ে ভাল উপায়টি ব্যবহার করা spyOnProperty। এটা তোলে 3 পরামিতি আশা এবং আপনি পাস করতে হবে getবা setকোন তৃতীয় PARAM হিসাবে।

উদাহরণ

const div = fixture.debugElement.query(By.css('.ellipsis-overflow'));
// now mock properties
spyOnProperty(div.nativeElement, 'clientWidth', 'get').and.returnValue(1400);
spyOnProperty(div.nativeElement, 'scrollWidth', 'get').and.returnValue(2400);

এখানে আমি সেটিং করছি getএর clientWidthএর div.nativeElementঅবজেক্ট।


6

আপনি যদি ES6 (ব্যাবেল) বা টাইপস্ক্রিপ্ট ব্যবহার করে থাকেন তবে আপনি গেট অ্যান্ড সেট অ্যাকসেসর ব্যবহার করে সম্পত্তিটি আটকে দিতে পারেন

export class SomeClassStub {
  getValueA = jasmine.createSpy('getValueA');
  setValueA = jasmine.createSpy('setValueA');
  get valueA() { return this.getValueA(); }
  set valueA(value) { this.setValueA(value); }
}

তারপরে আপনার পরীক্ষায় আপনি পরীক্ষা করতে পারেন যে সম্পত্তিটি সেট করা রয়েছে:

stub.valueA = 'foo';

expect(stub.setValueA).toHaveBeenCalledWith('foo');

অথবা, যদি পরীক্ষাগুলি পরীক্ষার অধীনে ক্লাসের অংশ হয় তবে স্টাবগুলি একটি সাবক্লাসে ইনজেকশনের ব্যবস্থা করা যেতে পারে।
সিসিপ্রোগ

6

এটি করার সঠিক উপায় হ'ল সম্পত্তির গুপ্তচর দিয়ে, এটি আপনাকে একটি নির্দিষ্ট মান সহ কোনও বস্তুর উপর সম্পত্তি সিমুলেট করার অনুমতি দেবে।

const spy = spyOnProperty(myObj, 'valueA').and.returnValue(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();

1

ধরুন এর মতো কোনও পদ্ধতি আছে যার জন্য srcপরীক্ষা করা দরকার ক্ষুদ্র চিত্রটির সম্পত্তি পরীক্ষা করা দরকার

function reportABCEvent(cat, type, val) {
                var i1 = new Image(1, 1);
                var link = getABC('creosote');
                    link += "&category=" + String(cat);
                    link += "&event_type=" + String(type);
                    link += "&event_value=" + String(val);
                    i1.src = link;
                }

নীচের স্পাইঅন () দ্বারা "নতুন চিত্র" পরীক্ষা থেকে নকল কোড খাওয়ানো হয় কারণ স্পাইঅন কোড এমন একটি বস্তু প্রদান করে যার কেবল একটি এসআরসি সম্পত্তি রয়েছে

যেভাবে ভেরিয়েবলটি "হুক" স্পাইঅন-এর নকল কোডে দৃশ্যমান হতে পারে এবং পরে "রিপোর্টএএবিসিএনএন্ট" বলা হওয়ার পরে

describe("Alphabetic.ads", function() {
    it("ABC events create an image request", function() {
    var hook={};
    spyOn(window, 'Image').andCallFake( function(x,y) {
          hook={ src: {} }
          return hook;
      }
      );
      reportABCEvent('testa', 'testb', 'testc');
      expect(hook.src).
      toEqual('[zubzub]&arg1=testa&arg2=testb&event_value=testc');
    });

এটি জুঁই ১.৩ এর জন্য তবে "এবং কলফেক" ২.০ নামের পরিবর্তিত হলে 2.0 এ কাজ করতে পারে


1

আমি একটি কেন্দো গ্রিড ব্যবহার করছি এবং অতএব বাস্তবায়নটিকে একটি গেটর পদ্ধতিতে পরিবর্তন করতে পারি না তবে আমি এটিকে (গ্রিডকে উপহাস করে) পরীক্ষা করতে চাই এবং গ্রিডটি নিজেই পরীক্ষা না করে। আমি একটি স্পাই অবজেক্ট ব্যবহার করছিলাম তবে এটি সম্পত্তি বিদ্রূপকে সমর্থন করে না তাই আমি এটি করি:

    this.$scope.ticketsGrid = { 
        showColumn: jasmine.createSpy('showColumn'),
        hideColumn: jasmine.createSpy('hideColumn'),
        select: jasmine.createSpy('select'),
        dataItem: jasmine.createSpy('dataItem'),
        _data: []
    } 

এটি কিছুটা দীর্ঘ বাতাসযুক্ত তবে এটি ট্রিট কাজ করে


0

আমি পার্টিতে কিছুটা দেরি করেছি আমি জানি তবে,

আপনি সরাসরি কল অবজেক্টে অ্যাক্সেস করতে পারতেন, যা আপনাকে প্রতিটি কলের জন্য ভেরিয়েবল দিতে পারে

expect(spy.calls.argsFor(0)[0].value).toBe(expectedValue)

-3

আপনি ভেরিয়েবলকে মক করতে পারবেন না তবে আপনি এর জন্য গিটার ফাংশন তৈরি করতে পারেন এবং আপনার স্পেক ফাইলটিতে সেই পদ্ধতিটিকে মক করতে পারেন।

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