কোনও জিনিস ছাড়াই কোনও ফাংশনে গুপ্তচরবৃত্তি করতে জেসমিন ব্যবহার করা


154

আমি জেসমিনে নতুন এবং সবেমাত্র এটি ব্যবহার শুরু করেছি। আমার কাছে প্রচুর ফাংশন সহ একটি লাইব্রেরি জেএস ফাইল রয়েছে যা কোনও বস্তুর সাথে সম্পর্কিত নয় (যেমন গ্লোবাল)। আমি এই ফাংশনগুলিতে গুপ্তচরবৃত্তি সম্পর্কে কীভাবে যেতে পারি?

আমি উইন্ডো / নথিটি অবজেক্ট হিসাবে ব্যবহার করার চেষ্টা করেছি, তবে ফাংশনটি বলা হলেও গুপ্তচর কাজ করেনি। আমি এটি নিম্নলিখিত হিসাবে একটি জাল বস্তুতে মোড়ানো চেষ্টা:

var fakeElement = {};
fakeElement.fakeMethod = myFunctionName;
spyOn(fakeElement, "fakeMethod");

এবং পরীক্ষা দিয়ে

expect(fakeElement.fakeMethod).toHaveBeenCalled();

গুপ্তচর কাজ না করায় এটিও কাজ করে না

উত্তর:


155

আপনি যদি আপনার ফাংশনটি সংজ্ঞায়িত করছেন:

function test() {};

তারপরে, এটি সমান:

window.test = function() {}  /* (in the browser) */

তাই spyOn(window, 'test')কাজ করা উচিত।

যদি তা না হয়, আপনিও সক্ষম হবেন:

test = jasmine.createSpy();

যদি এর মধ্যে কেউ কাজ না করে, আপনার সেটআপের সাথে অন্য কিছু চলছে।

আমি মনে করি না fakeElementপর্দার আড়ালে যা চলছে তার কারণে আপনার কৌশলটি কাজ করে। মূল গ্লোবালমাথোড এখনও একই কোডটিতে নির্দেশ করে। গুপ্তচরবৃত্তি যা করে তা হ'ল এটি প্রক্সি, তবে কেবল কোনও বস্তুর প্রসঙ্গে। আপনি যদি জাল এলিমেন্টের মাধ্যমে কল করার জন্য আপনার পরীক্ষার কোডটি পেতে পারেন তবে এটি কাজ করবে, তবে তারপরে আপনি বিশ্বব্যাপী এফএনএস দিতে সক্ষম হবেন।


2
এটা কাজ করেছে! আমি মনে করি যে আমি আগে ত্রুটিটি করছিলাম তা হ'ল আমি স্পেসঅনকে পদ্ধতির পরিবর্তে মেথড () দিয়ে কল করছি। ধন্যবাদ!
চেটার হুমিন

3
'উইন্ডো' বরাদ্দ না হওয়ায় আমাদের অটোমেশনের অংশ হিসাবে পরীক্ষা চালানোর জন্য চুটজপাহ ব্যবহার করে স্পাইঅন (উইন্ডো, 'পরীক্ষা') ব্যবহার করতে আমার কিছু সমস্যা হয়েছে। Jasmine.createSpy ব্যবহার করে () এটি প্রায় পেয়েছে।
হেনার্স

7
jasmine.createSpy () আমার জন্য নিখুঁতভাবে কাজ করেছে। ধন্যবাদ!
dplass

1
ব্যবহৃত test = jasmine.createSpy();angularJs গুপ্তচর $anchroScrollপুরোপুরি কাজ
এডগার মার্টিনেজ

1
কোনও কারণে আমি কোনওভাবেই কাজ করার উপায় পাচ্ছি না, তবে এটি সম্পূর্ণভাবে সম্ভব হতে পারে কারণ আমি একটি বিদ্যমান উইন্ডো ফাংশনটিকে উপহাস করার চেষ্টা করছি; $window.open(url, '_blank');একটি নতুন ট্যাব খোলার অভিপ্রায় (বা ব্রাউজার সেটআপের উপর নির্ভর করে উইন্ডো)। এটি কীভাবে এটি এই ফাংশনটি কল করছে এবং ব্রাউজার নির্বিশেষে ডান ইউআরএলটিতে নেভিগেট করছে তা যাচাই করে নেব কীভাবে?
CSS

71

টাইপস্ক্রিপ্ট ব্যবহারকারী:

আমি জানি ওপি জাভাস্ক্রিপ্ট সম্পর্কে জিজ্ঞাসা করেছে, তবে যে কোনও টাইপসক্রিপ্ট ব্যবহারকারী যারা এইগুলি জুড়ে আসেন তাদের জন্য যারা আমদানি করা ফাংশনটিতে গুপ্তচরবৃত্তি করতে চান, আপনি এখানে কি করতে পারেন তা এখানে।

পরীক্ষার ফাইলে, এর থেকে ফাংশনটির আমদানিকে রূপান্তর করুন:

import {foo} from '../foo_functions';

x = foo(y);

এটি:

import * as FooFunctions from '../foo_functions';

x = FooFunctions.foo(y);

তারপরে আপনি গুপ্তচর পারেন FooFunctions.foo:)

spyOn(FooFunctions, 'foo').and.callFake(...);
// ...
expect(FooFunctions.foo).toHaveBeenCalled();

3
টাইপস্ক্রিপ্ট ইঙ্গিত জন্য ধন্যবাদ। ES6 / ব্যাবেলের জন্য সমানভাবে হওয়া উচিত, তবে আমি এটি চেষ্টা করি নি।
hgoebl

1
মনে হয় এটি কেবল তখনই কার্যকর হয় যখন ফাংশনটি স্পষ্টভাবে ওরফে ফুফুঙ্কশনের সাথে কল করে । আমার একটি ফাংশন বার () রয়েছে যা ফ্যাক্টরি রিটার্নিং বাজ () এবং সেই বাজ () কলকে ফু () কল করতে চায়। এই পদ্ধতিটি সেই দৃশ্যে কাজ করতে দেখা যাচ্ছে না।
রিচার্ড ম্যাটসেন

4
যদি উপনামটিকে foo_function- এর ভিতরে নেওয়া export const FooFunctions = { bar, foo }; হয় এবং পরীক্ষায় আমদানি হয়ে যায় import { FooFunctions } from '../foo_functions'. তবে এটি কাজ করবে তবে, গোয়েন্দাকে কাজ করার জন্য উপনামটি এখনও স্পষ্টভাবে foo_funtions বেসরকারী প্রয়োগের মধ্যে ব্যবহার করা দরকার। const result = FooFunctions.foo(params)// গুপ্তচর রিপোর্ট কল const result = foo(params)// গুপ্তচর কোনও কল নেই
রিচার্ড ম্যাটসেন

2
মোহন মত কাজ! ধন্যবাদ, আপনি আমাকে অনেক সময় বাঁচিয়েছেন!
শ্রীঅক্সি

1
এটি আর কাজ করছে নাError: <spyOn> : parseCookie is not declared writable or has no setter
লিং ভু

42

2 টি বিকল্প আছে যা আমি ব্যবহার করি (জুঁই 2 এর জন্য)

এটি একদম সুস্পষ্ট নয় কারণ মনে হয় ফাংশনটি আসলে একটি জাল।

test = createSpy().and.callFake(test); 

দ্বিতীয় আরও ভার্বোজ, আরও স্পষ্ট এবং "ক্লিনার":

test = createSpy('testSpy', test).and.callThrough();

-> দ্বিতীয় যুক্তি দেখতে জুঁই উত্স কোড


এটি কিছুটা বেশি জ্ঞান অর্জন করে এবং সাফল্যের সাথে নকল করার পক্ষে যথেষ্ট পরিমাণে এটি ভেঙে দেয়। আমার কাছ থেকে +1 ধন্যবাদ, সি§
সিএসএস

9

খুব সহজ উপায়:

import * as myFunctionContainer from 'whatever-lib';

const fooSpy = spyOn(myFunctionContainer, 'myFunc');

1
import * as saveAsFunctions from 'file-saver';
..........
....... 
let saveAs;
            beforeEach(() => {
                saveAs = jasmine.createSpy('saveAs');
            })
            it('should generate the excel on sample request details page', () => {
                spyOn(saveAsFunctions, 'saveAs').and.callFake(saveAs);
                expect(saveAsFunctions.saveAs).toHaveBeenCalled();
            })

এটি আমার পক্ষে কাজ করেছে।


4
দয়া করে আপনার উত্তরে ব্যাখ্যা যুক্ত করুন, কোডটি প্রশ্নটি জিজ্ঞাসা করা ব্যক্তির পক্ষে স্বয়ংক্রিয়ভাবে তেমন সহায়ক নয় যদি তারা বুঝতে না পারে যে কি চলছে।
শেভিবো

0

আমার উত্তর @ ফ্লাওয়ারস্কেপ থেকে কিছুটা পৃথক হয়েছে যে আমদানি করা মডিউলে আমার একটি (ডিফল্ট এক্সপোর্ট) ফাংশন ছিল, আমি নিম্নলিখিতটি করেছি:

import * as functionToTest from 'whatever-lib';

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