টিএল; ডিআর একটি রাষ্ট্রীয় কাঠামোর মধ্যে কাজ করার সময় স্বয়ংক্রিয় ইউনিট পরীক্ষা সহজ করার জন্য কৌশলগুলি সনাক্তকরণে আমার সহায়তা প্রয়োজন।
পটভূমি:
আমি বর্তমানে টাইপস্ক্রিপ্ট এবং ফেজার ফ্রেমওয়ার্কে একটি গেম লিখছি । Phaser নিজেকে একটি HTML5 গেম ফ্রেমওয়ার্ক হিসাবে বর্ণনা করে যা আপনার কোডের কাঠামোকে সীমাবদ্ধ করার জন্য যতটা সম্ভব চেষ্টা করে। এটি কয়েকটি ট্রেড অফের সাথে আসে, যেমন একটি thereশ্বর-অবজেক্ট ফ্যাসার রয়েছে ame যা আপনাকে সমস্ত কিছু অ্যাক্সেস করতে দেয়: ক্যাশে, পদার্থবিজ্ঞান, গেমের স্টেটস এবং আরও অনেক কিছু।
এই স্থিতিস্থাপকতা আমার টাইলম্যাপের মতো প্রচুর কার্যকারিতা পরীক্ষা করা সত্যিই শক্ত করে তোলে। আসুন একটি উদাহরণ দেখুন:
এখানে আমি আমার টাইল স্তরগুলি সঠিকভাবে কিনা তা পরীক্ষা করে নিচ্ছি এবং আমি আমার টাইলম্যাপের মধ্যে দেয়াল এবং প্রাণীগুলি সনাক্ত করতে পারি:
export class TilemapTest extends tsUnit.TestClass {
constructor() {
super();
this.map = this.mapLoader.load("maze", this.manifest, this.mazeMapDefinition);
this.parameterizeUnitTest(this.isWall,
[
[{ x: 0, y: 0 }, true],
[{ x: 1, y: 1 }, false],
[{ x: 1, y: 0 }, true],
[{ x: 0, y: 1 }, true],
[{ x: 2, y: 0 }, false],
[{ x: 1, y: 3 }, false],
[{ x: 6, y: 3 }, false]
]);
this.parameterizeUnitTest(this.isCreature,
[
[{ x: 0, y: 0 }, false],
[{ x: 2, y: 0 }, false],
[{ x: 1, y: 3 }, true],
[{ x: 4, y: 1 }, false],
[{ x: 8, y: 1 }, true],
[{ x: 11, y: 2 }, false],
[{ x: 6, y: 3 }, false]
]);
আমি যাই করি না কেন, আমি মানচিত্রটি তৈরি করার চেষ্টা করার সাথে সাথে, ফ্যাসার অভ্যন্তরীণভাবে এটির ক্যাশেটি আহ্বান করে, যা কেবল রানটাইম চলাকালীন সময়েই জনবহুল।
পুরো গেমটি লোড না করেই আমি এই পরীক্ষার আবেদন করতে পারি না।
একটি জটিল সমাধান হতে পারে এমন কোনও অ্যাডাপ্টার বা প্রক্সি লেখার জন্য যা কেবলমাত্র যখন আমাদের এটি স্ক্রিনে প্রদর্শনের প্রয়োজন তখন মানচিত্র তৈরি করে। অথবা আমি নিজে প্রয়োজন কেবল সম্পদ লোড করে এবং পরে এটি কেবল নির্দিষ্ট পরীক্ষার শ্রেণি বা মডিউলটির জন্য ব্যবহার করে গেমটি নিজেকে জনপ্রিয় করতে পারি ulate
আমি যা অনুভব করি তা বেছে নিয়েছি এটি আরও যুক্তিযুক্ত, তবে এর বৈদেশিক সমাধান। আমার গেমটি লোড করা এবং এটির আসল খেলার মধ্যে, আমি একটি ঝিমঝিম করেছিলাম TestState
যা ইতিমধ্যে লোড হওয়া সমস্ত সম্পদ এবং ক্যাশে থাকা ডেটা দিয়ে পরীক্ষা চালায়।
এটি দুর্দান্ত, কারণ আমি নিজের সমস্ত কার্যকারিতা যাচাই করতে পারি, তবে এটিও অসাধারণ, কারণ এটি প্রযুক্তিগত একটি ইন্টিগ্রেশন পরীক্ষা এবং আমি কেবল পর্দায় তাকিয়ে দেখতে পারি না এবং শত্রুদের প্রদর্শিত হয় কিনা তা অবাক করে তোলে। আসলে, না, তাদের আইটেম হিসাবে ভুল পরিচয় দেওয়া হতে পারে (আগেই ঘটেছিল) বা - পরে পরীক্ষাগুলিতে- তাদের মৃত্যুর সাথে জড়িত ঘটনাগুলি দেওয়া নাও হতে পারে।
আমার প্রশ্ন - একটি পরীক্ষার রাজ্যে কি চকচকে এই সাধারণ? বিশেষত জাভাস্ক্রিপ্ট পরিবেশে কি আরও ভাল পন্থাগুলি রয়েছে যা আমি অবগত নই?
আরেকটি উদাহরণ:
ঠিক আছে, এখানে কী ঘটছে তা ব্যাখ্যা করার জন্য আরও একটি সুনির্দিষ্ট উদাহরণ:
export class Tilemap extends Phaser.Tilemap {
// layers is already defined in Phaser.Tilemap, so we use tilemapLayers instead.
private tilemapLayers: TilemapLayers = {};
// A TileMap can have any number of layers, but
// we're only concerned about the existence of two.
// The collidables layer has the information about where
// a Player or Enemy can move to, and where he cannot.
private CollidablesLayer = "Collidables";
// Triggers are map events, anything from loading
// an item, enemy, or object, to triggers that are activated
// when the player moves toward it.
private TriggersLayer = "Triggers";
private items: Array<Phaser.Sprite> = [];
private creatures: Array<Phaser.Sprite> = [];
private interactables: Array<ActivatableObject> = [];
private triggers: Array<Trigger> = [];
constructor(json: TilemapData) {
// First
super(json.game, json.key);
// Second
json.tilesets.forEach((tileset) => this.addTilesetImage(tileset.name, tileset.key), this);
json.tileLayers.forEach((layer) => {
this.tilemapLayers[layer.name] = this.createLayer(layer.name);
}, this);
// Third
this.identifyTriggers();
this.tilemapLayers[this.CollidablesLayer].resizeWorld();
this.setCollisionBetween(1, 2, true, this.CollidablesLayer);
}
আমি আমার টাইলম্যাপটি তিনটি অংশ থেকে তৈরি করছি:
- মানচিত্রের
key
manifest
বিশদ সকল সম্পদ (tilesheets এবং spritesheets) মানচিত্রে প্রয়োজনীয়- একটি
mapDefinition
যা টাইলম্যাপের কাঠামো এবং স্তরগুলি বর্ণনা করে।
প্রথমে, ফেজরের মধ্যে টাইলম্যাপটি তৈরি করতে আমাকে অবশ্যই সুপার কল করতে হবে। এটি সেই অংশ যা এই সমস্ত কলগুলিকে ক্যাশে অনুরোধ করে কারণ এটি কেবলমাত্র সংখ্যায় সংজ্ঞায়িত কীগুলি নয়, প্রকৃত সম্পদগুলি অনুসন্ধান করার চেষ্টা করে manifest
।
দ্বিতীয়ত, আমি টাইলশিট এবং টাইল স্তরগুলি টাইলম্যাপের সাথে যুক্ত করি। এটি এখন মানচিত্রটি রেন্ডার করতে পারে।
তৃতীয়ত, আমি বারবার আমার স্তর দিয়ে কোনো বিশেষ বস্তু খুঁজে যে আমি মানচিত্র থেকে বহিষ্কৃত করতে চাই: Creatures
, Items
, Interactables
এবং তাই ঘোষণা। আমি এই জিনিসগুলি পরে ব্যবহারের জন্য তৈরি এবং সঞ্চয় করি।
আমার কাছে এখনও একটি অপেক্ষাকৃত সহজ এপিআই রয়েছে যা আমাকে এই সত্তাগুলি সন্ধান, অপসারণ ও আপডেট করতে দেয়:
wallAt(at: TileCoordinates) {
var tile = this.getTile(at.x, at.y, this.CollidablesLayer);
return tile && tile.index != 0;
}
itemAt(at: TileCoordinates) {
return _.find(this.items, (item: Phaser.Sprite) => _.isEqual(this.toTileCoordinates(item), at));
}
interactableAt(at: TileCoordinates) {
return _.find(this.interactables, (object: ActivatableObject) => _.isEqual(this.toTileCoordinates(object), at));
}
creatureAt(at: TileCoordinates) {
return _.find(this.creatures, (creature: Phaser.Sprite) => _.isEqual(this.toTileCoordinates(creature), at));
}
triggerAt(at: TileCoordinates) {
return _.find(this.triggers, (trigger: Trigger) => _.isEqual(this.toTileCoordinates(trigger), at));
}
getTrigger(name: string) {
return _.find(this.triggers, { name: name });
}
আমি যাচাই করতে চাই এটি এই কার্যকারিতা। আমি যদি টাইল স্তর বা টাইলসেট যুক্ত না করি তবে মানচিত্রটি রেন্ডার করবে না, তবে আমি এটি পরীক্ষা করতে সক্ষম হতে পারি। যাইহোক, এমনকি সুপার (...) কল করা প্রসঙ্গ-নির্দিষ্ট বা রাষ্ট্রীয় যুক্তিটিও আহ্বান করে যা আমি আমার পরীক্ষাগুলিতে বিচ্ছিন্ন করতে পারি না।
new Tilemap(...)
ফ্যাসার তার ক্যাশে খনন শুরু করি । আমাকে তা স্থগিত করতে হবে, তবে এর অর্থ আমার টাইলম্যাপটি দুটি রাজ্যে রয়েছে যা একটি নিজেকে সঠিকভাবে উপস্থাপন করতে পারে না এবং সম্পূর্ণরূপে নির্মিত।