오늘은 비동기를 이용한 프로토타입 과제인 BeesBeesBees를 배워보자!
├── Grub
│ └── Bee
│ ├── HoneyMakerBee
│ └── ForagerBee
위에서 볼 수 있는 것처럼, 모든 Bee는 Grub을 기반으로 하여 각자의 특성에 맞는 일을 받게 된다.
공통된 특성을 기반으로 각자에게 맞는 특성을 부여받을 수 있는 것은 상속이 이루어졌음을 의미함!
이것을 토대로 과제를 작성해보자!
describe('Grub class functionality', () => {
var grub;
beforeEach(() => grub = new Grub());
it('`age` 속성은 `0`이어야 합니다', () => {
expect(grub.age).to.equal(0);
});
it('`color` 속성은 `pink`이어야 합니다', () => {
expect(grub.color).to.equal('pink');
});
it('`food` 속성은 `jelly`이어야 합니다', () => {
expect(grub.food).to.equal('jelly');
});
it('`eat` 메소드가 존재해야 합니다', () => {
expect(grub.eat).to.be.a('function');
});
it('`eat` 메소드를 통해 `Grub`이 젤리를 먹습니다', () => {
expect(grub.eat()).to.equal('Mmmmmmmmm jelly');
});
class Grub {
// TODO..
constructor() {
this.age = 0;
this.color = "pink";
this.food = "jelly";
}
eat() {
return `Mmmmmmmmm ${this.food}`;
}
}
module.exports = Grub;
describe('Bee class functionality', () => {
var bee;
beforeEach(() => bee = new Bee());
/* Overwrite methods from superclass */
it('`age` 속성은 `5`이어야 합니다', () => {
expect(bee.age).to.equal(5);
});
it('`color` 속성은 `yellow`이어야 합니다', () => {
expect(bee.color).to.equal('yellow');
});
/* Inherited from superclass */
it('`food` 속성은 Grub으로부터 상속받습니다', () => {
expect(bee.food).to.equal('jelly');
});
it('`eat` 메소드는 Grub으로부터 상속받습니다', () => {
expect(bee.eat).to.be.a('function');
});
/* New methods and properties */
it('`job` 속성은 `Keep on growing`이어야 합니다', () => {
expect(bee.job).to.equal('Keep on growing');
});
const Grub = require("./Grub");
class Bee extends Grub {
// TODO..
constructor() {
super();
this.age = 5;
this.color = "yellow";
this.job = "Keep on growing";
}
}
module.exports = Bee;
describe('HoneyMakerBee class functionality', () => {
var honeyBee;
beforeEach(() => honeyBee = new HoneyMakerBee());
/* Overwrite methods from superclass */
it('`age` 속성은 `10`이어야 합니다', () => {
expect(honeyBee.age).to.equal(10);
});
it('`job` 속성은 `make honey`이어야 합니다', () => {
expect(honeyBee.job).to.equal('make honey')
});
/* Inherited from superclass */
it('`color` 속성은 `Bee`로부터 상속받습니다', () => {
expect(honeyBee.color).to.equal('yellow');
});
it('`food` 속성은 `Grub`으로부터 상속받습니다', () => {
expect(honeyBee.food).to.equal('jelly');
});
it('`eat` 메소드는 `Grub`으로부터 상속받습니다', () => {
expect(honeyBee.eat).to.be.a('function');
});
/* New methods and properties */
it('`honeyPot` 속성은 `0`이어야 합니다', () => {
expect(honeyBee.honeyPot).to.equal(0);
});
it('`makeHoney` 메소드는 `honeyPot`에 1씩 추가합니다', () => {
expect(honeyBee.makeHoney).to.be.a('function');
honeyBee.makeHoney();
expect(honeyBee.honeyPot).to.equal(1);
honeyBee.makeHoney();
expect(honeyBee.honeyPot).to.equal(2);
});
it('`giveHoney` 메소드는 `honeyPot`에 1씩 뺍니다', () => {
expect(honeyBee.giveHoney).to.be.a('function');
honeyBee.makeHoney();
honeyBee.makeHoney();
honeyBee.makeHoney();
honeyBee.giveHoney();
expect(honeyBee.honeyPot).to.equal(2);
});
const Bee = require("./Bee");
class HoneyMakerBee extends Bee {
// TODO..
constructor() {
super();
this.age = 10;
this.job = "make honey";
this.honeyPot = 0;
}
makeHoney() {
this.honeyPot++;
}
giveHoney() {
this.honeyPot--;
}
}
module.exports = HoneyMakerBee;
describe('ForagerBee class functionality', () => {
var foragerBee;
beforeEach(() => (foragerBee = new ForagerBee()));
/* Overwrite methods from superclass */
it('`age` 속성은 `10`이어야 합니다', () => {
expect(foragerBee.age).to.equal(10);
});
it('`job` 속성은 `find pollen`이어야 합니다', () => {
expect(foragerBee.job).to.equal('find pollen');
});
/* Inherited from superclass */
it('`color` 속성은 `Bee`로부터 상속받습니다', () => {
expect(foragerBee.color).to.equal('yellow');
});
it('`food` 속성은 `Grub`으로부터 상속받습니다', () => {
expect(foragerBee.food).to.equal('jelly');
});
it('`eat` 메소드는 `Grub`으로부터 상속받습니다', () => {
expect(foragerBee.eat).to.be.a('function');
});
/* New methods and properties */
it('`canFly` 속성은 `true`이어야 합니다', () => {
expect(foragerBee.canFly).to.equal(true);
});
it('`treasureChest` 속성은 빈 배열 `[]`이어야 합니다', () => {
expect(foragerBee.treasureChest).to.be.a('array');
});
it('`forage` 메소드를 통해 `treasureChest` 속성에 보물을 추가할 수 있어야 합니다', () => {
foragerBee.forage('pollen');
foragerBee.forage('flowers');
foragerBee.forage('gold');
expect(foragerBee.treasureChest).to.have.length(3);
expect(foragerBee.treasureChest[0]).to.equal('pollen');
expect(foragerBee.treasureChest[1]).to.equal('flowers');
expect(foragerBee.treasureChest[2]).to.equal('gold');
});
const Bee = require("./Bee");
class ForagerBee extends Bee {
// TODO..
constructor() {
super();
this.age = 10;
this.job = "find pollen";
this.canFly = true;
this.treasureChest = [];
}
forage(treasure) {
this.treasureChest.push(treasure);
}
}
module.exports = ForagerBee;