మల్టీప్లేయర్ గేమ్ల కోసం NestJSలో వెబ్సాకెట్ సవాళ్లను పరిష్కరించడం
దీనితో మల్టీప్లేయర్ కార్డ్ గేమ్ను అభివృద్ధి చేయడం మరియు అనేక క్లిష్టమైన పనులను అందిస్తుంది, ప్రత్యేకించి గేమ్ ఇన్స్టాన్స్ల కోసం డైనమిక్ నేమ్స్పేస్లను నిర్వహించడానికి. ఈ రకమైన గేమ్లలో గోప్యతను కాపాడేందుకు, ప్లేయర్లను దూరంగా ఉంచాలి, ప్రైవేట్ సమాచారాన్ని డేటాబేస్ నుండి దూరంగా ఉంచాలి మరియు ఇతరులు వారి కార్డ్లను చూడకుండా నిరోధించాలి. డేటా ఉల్లంఘన జరిగినప్పుడు కూడా, మా పద్ధతి గేమ్ స్టేట్లను రక్షిస్తుంది మరియు గోప్యతకు హామీ ఇస్తుంది.
గేమ్ను తయారు చేయడంలో మొదటి దశ ఉపాధి నిర్దిష్ట గేమ్ సెషన్లకు ఆటగాళ్లను లింక్ చేయడానికి కనెక్షన్లు. వినియోగదారు గేమ్లో చేరడానికి లేదా సృష్టించడానికి క్లిక్ చేసినప్పుడు /గేమ్/:id వంటి డైనమిక్గా స్కోప్ చేయబడిన వెబ్సాకెట్ నేమ్స్పేస్ని ఉపయోగించి క్లయింట్ కనెక్ట్ చేయవచ్చు. సర్వర్ ఆట వస్తువుతో సమాధానం ఇస్తుంది. మాన్యువల్గా నిర్వహించే గదులతో అనుబంధించబడిన ఓవర్హెడ్ను తప్పించేటప్పుడు ఈ డిజైన్ ప్రతి గేమ్ సెషన్ యొక్క ప్రత్యేకతను నిర్వహిస్తుంది.
ఈ డైనమిక్గా స్కోప్ చేయబడిన నేమ్స్పేస్లలో ఈవెంట్లను విడుదల చేయడం సవాలుగా ఉంది. this.server.of() పద్ధతి ఒక ఫంక్షన్గా ఉండకపోవడం అనేది డెవలపర్లు అంతటా అమలు చేయగల ఒక సమస్య, ఇది గేమ్ యొక్క ఈవెంట్ ఫ్లోను విసిరివేస్తుంది. గేమ్ రిజిస్ట్రేషన్ లేదా స్టేట్ అప్గ్రేడ్లను మూసివేయడం వంటి ముఖ్యమైన పరివర్తనలను నిర్వహించేటప్పుడు ఇది చాలా ముఖ్యమైనది.
యొక్క మెరుగైన గ్రహణశక్తి ఈ సమస్యను పరిష్కరించడానికి ఈ ఫ్రేమ్వర్క్లోని వెబ్సాకెట్ గేట్వేలు మరియు నేమ్స్పేస్ కార్యకలాపాలు అవసరం. మేము ఈ ట్యుటోరియల్లో సమస్యను లోతుగా పరిశీలిస్తాము మరియు మీ గేమ్లో WebSocket కనెక్టివిటీ సరిగ్గా పనిచేస్తుందని నిర్ధారించుకోండి మరియు తరచుగా జరిగే ఈ సమస్యకు నమ్మదగిన పరిష్కారాన్ని అందిస్తాము.
ఆదేశం | ఉపయోగం యొక్క ఉదాహరణ |
---|---|
@WebSocketGateway() | WebSocket గేట్వేని నిర్వచించడం ద్వారా, ఈ డెకరేటర్ వెబ్సాకెట్ సర్వర్లను నిర్మించడానికి మిమ్మల్ని అనుమతిస్తుంది. . విభిన్న గేమ్ సెషన్లను నిర్వహించడానికి, `నేమ్స్పేస్` ఎంపిక డైనమిక్గా గేట్వే కోసం URL నమూనాను కేటాయిస్తుంది. |
@WebSocketServer() | ఇంజెక్ట్ చేయడం ద్వారా గేట్వే నుండి నేరుగా ఈవెంట్ ఎమిషన్ మరియు సాకెట్ నిర్వహణను ప్రారంభిస్తుంది తరగతిలోకి సర్వర్ వస్తువు. |
OnEvent() | ఈ డెకరేటర్ గేమ్ రిజిస్ట్రేషన్ వ్యవధి ముగింపు వంటి అప్లికేషన్లోని ఇతర ప్రాంతాల నుండి సిగ్నల్ల కోసం చూస్తుంది. రాష్ట్ర మార్పుల గురించి వివిధ సేవలకు తెలియజేయడానికి ఇది చాలా అవసరం. |
client.join() | గేమ్ IDని ఉపయోగించి క్లయింట్ని నిర్దిష్ట WebSocket "రూమ్"కి కనెక్ట్ చేస్తుంది. నిర్దిష్ట గేమ్లకు ఈవెంట్లను స్కోప్ చేయడం ద్వారా సంబంధిత క్లయింట్లు మాత్రమే అప్డేట్లను అందుకుంటారని ఇది నిర్ధారిస్తుంది. |
client.leave() | WebSocket "గది" నుండి క్లయింట్ను తీసివేస్తుంది, డిస్కనెక్ట్ చేసిన తర్వాత, అవి గేమ్-నిర్దిష్ట ఈవెంట్లకు లోబడి ఉండవని నిర్ధారించుకోండి. |
this.server.to() | ఈవెంట్లను నియమించబడిన గదికి పంపుతుంది. గేమ్ స్థితికి సంబంధించిన అప్డేట్లతో సహా కనెక్ట్ చేయబడిన క్లయింట్లందరికీ గేమ్-నిర్దిష్ట ఈవెంట్లను పంపడం చాలా కీలకం. |
emit() | కనెక్ట్ చేయబడిన నిర్దిష్ట గదులు లేదా క్లయింట్లకు ఈవెంట్లను ప్రసారం చేయడానికి ఉపయోగించబడుతుంది. "ప్లేయర్ యాక్షన్" లేదా "గేమ్ స్టార్ట్" ఈవెంట్ల వంటి నిజ-సమయ నవీకరణలను ప్రసారం చేయడం చాలా కీలకం మరియు ఈ సాంకేతికత అవసరం. |
jest.spyOn() | నిర్దిష్ట కోడ్ విభాగాలను మోసగించడానికి ఉపయోగించే యూనిట్ టెస్టింగ్ కోసం ఒక పరీక్షా పద్ధతి. ఇక్కడ, పరీక్షిస్తున్నప్పుడు, గేమ్ గేట్వేలో ఈవెంట్లు విజయవంతంగా విడుదల చేయబడతాయని నిర్ధారించడానికి ఇది ఉపయోగించబడింది. |
mockReturnValue() | ఈ టెక్నిక్, యూనిట్ పరీక్షల సమయంలో అసలు అమలు అవసరం లేకుండా ప్రవర్తనను అనుకరించడం కోసం సహాయకరంగా ఉంటుంది, పరీక్ష సమయంలో నిర్దిష్ట ఫలితాన్ని అందించడానికి మోక్డ్ ఫంక్షన్ను సెట్ చేస్తుంది. |
NestJSలో డైనమిక్ వెబ్సాకెట్ నేమ్స్పేస్ సమస్యలను పరిష్కరిస్తోంది
అందించిన స్క్రిప్ట్లు ఉపయోగించేటప్పుడు కీలకమైన సమస్యను పరిష్కరిస్తాయి తో నిర్మించబడిన మల్టీప్లేయర్ గేమ్లో , పేరు ఖాళీలు డైనమిక్గా పేరు పెట్టబడినవి. ప్రతి గేమ్ కోసం డైనమిక్గా రూపొందించబడిన నేమ్స్పేస్కు ఈవెంట్లను విడుదల చేయడంతో సమస్య ప్రత్యేకంగా ఉంటుంది. స్కోప్డ్ ఈవెంట్ ఎమిషన్ మరియు డైనమిక్ నేమ్స్పేస్ మేనేజ్మెంట్ కలయిక విధానంలో ఉపయోగించబడుతుంది. సాధారణ వ్యక్తీకరణను ఉపయోగించి, మొదటి స్క్రిప్ట్లోని `@WebSocketGateway()} డెకరేటర్ వెబ్సాకెట్ను డైనమిక్గా నిర్మించబడిన నేమ్స్పేస్తో కాన్ఫిగర్ చేస్తుంది. ప్రతి గేమ్ సెషన్కు విభిన్నమైన నేమ్స్పేస్ల నిర్మాణాన్ని ప్రారంభించడం ద్వారా రాష్ట్ర నిర్వహణ ప్రతి గేమ్ ఉదాహరణకి స్కోప్ చేయబడుతుందని ఇది హామీ ఇస్తుంది.
స్క్రిప్ట్ యొక్క ప్రధాన ఆదేశం, `this.server.of()`, నియమించబడిన గేమ్ నేమ్స్పేస్కు ఈవెంట్లను విడుదల చేయడాన్ని లక్ష్యంగా పెట్టుకుంది. కానీ {of()} ఉపయోగించి అమలు చేయబడినందున , ఇది నేరుగా అందుబాటులో ఉండే ఫంక్షన్ కాదు , సమస్య ఎందుకు వస్తుంది. బదులుగా, మేము అందించే `.to()} ఫంక్షన్ ద్వారా గదులను నిర్వహించాలనుకుంటున్నాము Socket.io, ఇది నిర్దిష్ట "గదులు" లేదా గేమ్ సంఘటనలకు ఈవెంట్లను పంపడానికి అనుమతిస్తుంది. ఈ రీవర్క్ రెండవ స్క్రిప్ట్లో పరిచయం చేయబడింది, ఇక్కడ ప్రతి పార్టిసిపెంట్ `client.join()` పద్ధతిని ఉపయోగించి గేమ్ ID ఆధారంగా గదికి జోడించబడతారు. గేమ్-సంబంధిత ఈవెంట్లు నిర్దిష్ట గేమింగ్ రూమ్లోని ఆటగాళ్లకు మాత్రమే పంపబడతాయని ఇది హామీ ఇస్తుంది.
ప్లేయర్ కనెక్షన్లు మరియు డిస్కనెక్ట్లను నిర్వహించడానికి రెండవ టెక్నిక్లో `హ్యాండిల్కనెక్షన్()` మరియు `హ్యాండిల్డిస్కనెక్ట్()` పద్ధతులు ఉపయోగించబడతాయి. ఈ ఫంక్షన్లు నిర్దిష్ట గేమ్ రూమ్కు జోడించబడిన లేదా తొలగించబడిన వారిని నియంత్రించే బాధ్యతను కలిగి ఉంటాయి. ఆటగాడి సాకెట్ వారు చేరినప్పుడు నేమ్స్పేస్ నుండి తీసుకోబడిన గేమ్ IDకి అనుగుణంగా ఉండే గదికి లింక్ చేయబడింది. ఈ పరిష్కారం గేమ్ స్థితిని వేరుచేయడం మరియు సంబంధిత పాల్గొనేవారిపై మాత్రమే కమ్యూనికేషన్ను కేంద్రీకరించడం ద్వారా సర్వర్లో ఒకేసారి అనేక గేమ్లను నిర్వహించే సంక్లిష్టతను తగ్గిస్తుంది.
చివరి పద్ధతిలో డైనమిక్ వెబ్సాకెట్ ఈవెంట్ల సరైన నిర్వహణకు హామీ ఇవ్వడానికి యూనిట్ పరీక్ష ఉంటుంది. ఈవెంట్లు విడుదలైనప్పుడు సరైన నేమ్స్పేస్ (గేమ్ రూమ్) లక్ష్యంగా ఉందని పరీక్ష ధృవీకరించవచ్చు మరియు `jest.spyOn()`ని ఉపయోగించడం ద్వారా WebSocket ఈవెంట్ ఉద్గారిణి యొక్క ప్రవర్తనను అనుకరిస్తుంది. డైనమిక్ వెబ్సాకెట్ అమలు వివిధ గేమ్ సెషన్లు మరియు పరిస్థితులలో ఊహించిన విధంగా పనిచేస్తుందని ఈ దశ హామీ ఇస్తుంది. పరీక్షా విధానాలను చేర్చడం ద్వారా, రాబోయే సవరణలు కమ్యూనికేషన్ సిస్టమ్ యొక్క ముఖ్యమైన లక్షణాలకు అంతరాయం కలిగించవని నిర్ధారించుకోవడం సాధ్యమవుతుంది.
NestJS గేమ్ సెటప్లో వెబ్సాకెట్ నేమ్స్పేస్ సమస్యను పరిష్కరించడం
విధానం 1: ఉపయోగించడం డైనమిక్ నేమ్స్పేస్తో మరియు తిరిగి పని చేస్తుంది నేమ్స్పేస్ హ్యాండ్లింగ్ మెకానిజం.
import { WebSocketGateway, WebSocketServer, OnGatewayInit, ConnectedSocket } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { OnEvent } from '@nestjs/event-emitter';
@WebSocketGateway({
namespace: /\/game\/[a-zA-Z0-9]+/,
cors: { origin: '*' },
})
export class GameGateway implements OnGatewayInit {
@WebSocketServer() server: Server;
afterInit() {
console.log('WebSocket Initialized');
}
@OnEvent('game.registration-closed')
handleGameReady(game: Game) {
const gameNamespace = `/game/${game._id}`;
const nsp = this.server.of(gameNamespace);
if (nsp) {
nsp.emit('pregame', game);
} else {
console.error('Namespace not found:', gameNamespace);
}
}
}
NestJS WebSocketsలో సరైన డైనమిక్ నేమ్స్పేస్ బైండింగ్ని నిర్ధారించడానికి రీఫ్యాక్టర్
విధానం 2: అంతర్నిర్మితాన్ని ఉపయోగించడం గది నిర్వహణ సాధనాలు, డైనమిక్ నేమ్స్పేస్ విధానాన్ని సవరించండి.
import { WebSocketGateway, WebSocketServer, OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { OnEvent } from '@nestjs/event-emitter';
@WebSocketGateway({
cors: { origin: '*' },
})
export class GameGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer() server: Server;
afterInit() {
console.log('WebSocket Initialized');
}
async handleConnection(client: Socket) {
const gameId = this.extractGameIdFromNamespace(client.nsp.name);
client.join(gameId);
}
async handleDisconnect(client: Socket) {
const gameId = this.extractGameIdFromNamespace(client.nsp.name);
client.leave(gameId);
}
@OnEvent('game.registration-closed')
handleGameReady(game: Game) {
this.server.to(game._id).emit('pregame', game);
}
private extractGameIdFromNamespace(nsp: string): string {
const match = nsp.match(/\/game\/([a-zA-Z0-9]+)/);
return match ? match[1] : '';
}
}
NestJSలో యూనిట్ టెస్టింగ్తో పరీక్ష మరియు ధ్రువీకరణ
విధానం 3: నేమ్స్పేస్ నిర్వహణ మరియు వెబ్సాకెట్ ఈవెంట్లను ధృవీకరించడానికి యూనిట్ పరీక్షలను చేర్చండి.
import { Test, TestingModule } from '@nestjs/testing';
import { GameGateway } from './game.gateway';
import { EventEmitterModule } from '@nestjs/event-emitter';
describe('GameGateway', () => {
let gateway: GameGateway;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [EventEmitterModule.forRoot()],
providers: [GameGateway],
}).compile();
gateway = module.get<GameGateway>(GameGateway);
});
it('should emit pregame event when registration closes', () => {
const game = { _id: 'game123', players: [] };
const emitSpy = jest.spyOn(gateway.server, 'to').mockReturnValue({ emit: jest.fn() } as any);
gateway.handleGameReady(game);
expect(emitSpy).toHaveBeenCalledWith('game123');
});
});
వెబ్సాకెట్ గేమ్లలో డైనమిక్ నేమ్స్పేస్ మేనేజ్మెంట్ను అర్థం చేసుకోవడం
ఉపయోగిస్తున్నప్పుడు నేమ్స్పేస్లను నిర్వహించడం చాలా కీలకం మరియు ఈవెంట్ ఎమిషన్ మరియు గేమ్ స్టేట్ మేనేజ్మెంట్ నిర్దిష్ట గేమ్ సెషన్లకు పరిమితం చేయబడిందని హామీ ఇవ్వడానికి మల్టీప్లేయర్ గేమ్లను రూపొందించడానికి. నేమ్స్పేస్లను డైనమిక్గా క్రియేట్ చేయడం వల్ల ప్రతి గేమ్ ఇన్స్టాన్స్కి ప్రత్యేక కమ్యూనికేషన్ రూట్ ఉంటుంది. ఆటగాళ్ళు ఈ విభాగానికి కృతజ్ఞతలు తెలుపుతూ వారి ప్రస్తుత సెషన్కు సంబంధించిన సమాచారాన్ని మాత్రమే స్వీకరిస్తారు, ఇది ఒక గేమ్లో తీసుకున్న కార్యకలాపాలు మరొక గేమ్లోని వాటిని ప్రభావితం చేయవని హామీ ఇస్తుంది. డైనమిక్ నేమ్స్పేస్ టెక్నిక్ను ఉపయోగించడం అనేది ఒక పని చేయగల పరిష్కారం, దీనిలో ప్రతి గేమ్ యొక్క ప్రత్యేకమైన వెబ్సాకెట్ నేమ్స్పేస్ వంటి URL ద్వారా సూచించబడుతుంది .
పేర్కొన్న విధంగా నలుగురు ఆటగాళ్ల కార్డ్ గేమ్ కోసం, గోప్యత మరియు భద్రత చాలా ముఖ్యమైనవి. ప్లేయర్ కార్డ్ని మరెవరూ చూడకుండా చూసుకుంటూ రియల్ టైమ్ స్టేట్ అప్డేట్లను నియంత్రించడం చాలా కీలకం. డైనమిక్గా పేరు పెట్టబడిన వెబ్సాకెట్ గేట్వేతో గేమ్ సెషన్లను వేరుచేయడం సులభం అవుతుంది. దురదృష్టవశాత్తు, నిర్దిష్ట గేమ్ యొక్క నేమ్స్పేస్కు ఈవెంట్లను విడుదల చేయడానికి పద్ధతి అనుమతించదు, ఇది సమస్యలను కలిగిస్తుంది . ప్రత్యామ్నాయంగా, , అందించే సాంకేతికత Socket.io స్కోప్డ్ ఈవెంట్ ఉద్గారాలను సమర్ధవంతంగా నిర్వహిస్తుంది, గదులను నిర్వహించడానికి లేదా ప్రత్యక్ష ఈవెంట్ ఉద్గారాలను నిర్వహించడానికి డెవలపర్లు తప్పనిసరిగా ఉపయోగించాలి.
నేమ్స్పేస్లను సముచితంగా నిర్వహించడమే కాకుండా, డిస్కనెక్ట్లు మరియు రీకనెక్షన్ల వంటి అంచు పరిస్థితులను పరిష్కరించడం మరియు గేమ్ స్థితి పరివర్తన సమయంలో తగిన ఈవెంట్ ఫ్లోకు హామీ ఇవ్వడం చాలా కీలకం. ఈవెంట్ శ్రోతలను సముచితంగా సెటప్ చేయడం మరియు ఉపయోగించడం ద్వారా యొక్క ఈవెంట్-ఆధారిత నిర్మాణం, డెవలపర్లు స్కేలబుల్ మరియు ప్రభావవంతమైన నిజ-సమయ ప్లేయర్-సర్వర్ కనెక్షన్ని నిర్వహించవచ్చు. గేమ్ మరింత క్లిష్టంగా మారినందున ఈ ఫీచర్లు పని చేస్తూనే ఉండేలా చూసుకోవడం ద్వారా యూనిట్ పరీక్షలు భవిష్యత్ అప్డేట్లు మరియు మెరుగుదలలకు బలమైన ఆధారాన్ని అందిస్తాయి.
- వెబ్సాకెట్లో నేను డైనమిక్గా నేమ్స్పేస్లను ఎలా సృష్టించగలను?
- వెబ్సాకెట్ను aతో అనుకూలీకరించడానికి మీరు సాధారణ వ్యక్తీకరణలను ఉపయోగించవచ్చు లో ఆస్తి నేమ్స్పేస్లను డైనమిక్గా నిర్మించడానికి డెకరేటర్. ఇది గేమ్కు ప్రత్యేకమైన నేమ్స్పేస్లను అనువైనదిగా చేస్తుంది.
- ఉపయోగించడానికి ప్రత్యామ్నాయం ఏమిటి NestJSలో?
- మీరు ఉపయోగించవచ్చు ఈవెంట్ ఉద్గారాల కోసం నిర్దిష్ట గదులు లేదా నేమ్స్పేస్లను లక్ష్యంగా చేసుకోవడానికి లో ఫంక్షన్ కాదు .
- వెబ్సాకెట్ గేమ్లలో ప్లేయర్ డిస్కనెక్ట్లను నేను ఎలా నిర్వహించగలను?
- ది ప్లేయర్ డిస్కనెక్ట్లను నిర్వహించడానికి సాంకేతికత ఉపయోగించబడుతుంది; ఇది ఆటగాడిని ఆట గది నుండి బయటకు తీసుకెళ్లడానికి మరియు అవసరమైన ఏదైనా శుభ్రపరచడానికి మిమ్మల్ని అనుమతిస్తుంది.
- నేను NestJSలో WebSocket కార్యాచరణను ఎలా పరీక్షించగలను?
- ఈవెంట్ ఉద్గారాలను అనుకరించడానికి మరియు గేమ్ స్థితి మారినప్పుడు సరైన ఈవెంట్లు విడుదల చేయబడతాయో లేదో ధృవీకరించడానికి ఉపయోగించవచ్చు.
- వెబ్సాకెట్ గేమ్లోని గదుల ప్రయోజనం ఏమిటి?
- ఆటగాళ్లను విభిన్నమైన గేమ్ సెషన్లుగా విభజించడం ద్వారా, ఈవెంట్లు తగిన ప్లేయర్ గ్రూప్కు స్కోప్ చేయబడతాయని నిర్ధారించుకోవడంలో గదులు సహాయపడతాయి. మరియు పద్ధతులు.
డైనమిక్ నేమ్స్పేస్లను నిర్వహించడం కష్టంగా ఉంటుంది NestJSతో గేమ్లు, ప్రత్యేకించి ప్రతి గేమ్ దృష్టాంతానికి దాని స్వంత స్కోప్డ్ కమ్యూనికేషన్ అవసరమైనప్పుడు. వివిక్త గేమ్ సెషన్లను నిర్వహించడానికి మరింత ప్రభావవంతమైన సాంకేతికత ఏమిటంటే గదులను ఉపయోగించడం , ఇది NestJSలో నిర్వచించబడని "this.server.of()" సమస్యను పరిష్కరిస్తుంది.
ఈవెంట్ ఫ్లోను మూల్యాంకనం చేయడం మరియు గేమ్ స్టేట్లను రూమ్లుగా విభజించడం వంటి ఈ ఉత్తమ పద్ధతులను అమలు చేయడం ద్వారా మీ మల్టీప్లేయర్ గేమ్ సురక్షితంగా మరియు స్కేలబుల్గా ఉందని మీరు నిర్ధారించుకోవచ్చు. ఈ మార్పులు ఆటగాళ్లను మరియు వారి గేమ్ డేటాను నిర్వహించే వ్యవస్థీకృత పద్ధతిని అందించడం ద్వారా క్లిష్టమైన పరిష్కారాల అవసరాన్ని తొలగిస్తాయి.
- లో వెబ్సాకెట్ అమలుపై వివరాలు అధికారిక NestJS డాక్యుమెంటేషన్లో కనుగొనవచ్చు: NestJS వెబ్సాకెట్లు .
- ఉపయోగించి డైనమిక్ నేమ్స్పేస్లను నిర్వహించడంలో సమస్య Socket.io డాక్యుమెంటేషన్ నుండి సూచించబడింది: Socket.io గదులు .
- WebSocketsతో స్కేలబుల్ నిజ-సమయ మల్టీప్లేయర్ గేమ్లను రూపొందించడానికి ఉత్తమ పద్ధతులు ఈ వనరు నుండి సేకరించబడ్డాయి: MDN WebSockets API .
- వెబ్సాకెట్లను ఉపయోగించే పరీక్షా పద్దతి జెస్ట్ యొక్క అధికారిక డాక్యుమెంటేషన్ నుండి తీసుకోబడింది: జెస్ట్ మాక్ విధులు .