首页 > 解决方案 > 如何在使用 JS 的单元测试中实例化类中的类

问题描述

关于如何处理这个测试套件的问题。我被要求在 Bartender 类的方法中实例化 Beer 类。我希望我的 takeOrder 方法接受多个输入,因此我需要在 takeOrder 中调用 Beer 类构造函数。

这是我的啤酒课:

  constructor(newBeer) {
    this.brewer = newBeer.brewer;
    this.name = newBeer.name;
    this.type = newBeer.type;
    this.price = newBeer.price;
    this.volume = newBeer.volume;
    this.isFlat = false;
  }
}

我必须将 Beer 的一个实例推送到 Bartender 类中的 orders 数组中,但我不知道如何处理。这是我的调酒师课程代码:

class Bartender {
  constructor(name, hourlyWage){
    this.name = name;
    this.hourlyWage = hourlyWage;
    this.orders = [];
  }
  takeOrder(newOrder) {
    var newOrder = new Beer();
    this.orders.push(newOrder);
  }
}

我在我的 npm 测试中不断收到此错误消息:

 1) Bartender
       should be able to take orders:
     AssertionError: expected 'Grand Teton Brewing' to be an instance of Beer
      at Context.<anonymous> (test/bartender-test.js:33:12)
      at processImmediate (node:internal/timers:464:21)

这是我一直失败的调酒师单元测试:

it('should be able to take orders', function() {
    var bartender = new Bartender("Chaz", 8.50);

    bartender.takeOrder("Grand Teton Brewing", "Bitch Creek", "Brown Ale", 7, 16);

    assert.instanceOf(bartender.orders[0], Beer);
    assert.equal(bartender.orders.length, 1);
    assert.equal(bartender.orders[0].brewer, 'Grand Teton Brewing');
    assert.equal(bartender.orders[0].name, 'Bitch Creek');
    assert.equal(bartender.orders[0].type, 'Brown Ale');
    assert.equal(bartender.orders[0].price, 7);
    assert.equal(bartender.orders[0].volume, 16);
  });

Lmk 如果有人有任何建议。谢谢。

标签: javascriptarraysclass

解决方案


您的代码有两个问题。

首先,该bartender.takeOrder功能有一个错误。newOrder因为没有使用参数,而是重新声明了它。建议修复

takeOrder(newOrder) {
  this.order.push(new Beer(newOrder))

其次,你传递了错误的论据bartender.takeOrder。当你运行时,只使用了第一个参数"Grand Teton Brewing",其余的被丢弃了。

bartender.takeOrder("Grand Teton Brewing", "Bitch Creek", "Brown Ale", 7, 16);

建议修复,将它们包装在一个对象中:

bartender.takeOrder({
  brewer: 'Grand Teton Brewing',
  name: '',
  ...
})

推荐阅读