JavaScript函数;在本地工作但不适用于Lambda Minibootcamp

时间:2017-09-12 00:08:06

标签: node.js object testing methods npm

这让我发疯了。任何帮助,将不胜感激。情况:

一个已经存在的对象,storeItem有两个相关的属性,price和discountPercentage。我将编写一个函数(来自对象外部),名为addCalculateDiscountPrice,它将一个名为calculateDiscountPrice的方法添加到storeItem,返回折扣价格。

以下是代码:

function addCalculateDiscountPriceMethod(storeItem) {
  // add a method to the storeItem object called 'calculateDiscountPrice'
  // this method should multiply the storeItem's 'price' and  'discountPercentage' to get the discount
  // the method then subtracts the discount from the price and returns the discounted price
  // example: 
  // price -> 20
  // discountPercentage -> .2
  // discountPrice = 20 - (20 * .2)
  storeItem.calculateDiscountPrice = function() {
    var discount = this.discountPercentage;
    var saved = this.price * discount;
    var finalPrice = this.price - saved;
    return finalPrice;
  };
}

这是Lambda JavaScript Mini Bootcamp的一部分,它让我在用git克隆后在每个分配目录中安装npm。当我在终端中使用jsnode运行相同的代码(当然使用相关的现有对象)时,在注释中使用示例变量时,我得到预期的16输出。但是,当我运行npm测试时,我得到以下错误:

FAIL  tests/test.js
  ● addCalculateDiscountPriceMethod(storeItem) › should add the method    'calculateDiscountPrice' to the store item object

    TypeError: Cannot read property 'calculateDiscountPrice' of undefined

  at Object.<anonymous> (tests/test.js:209:64)

  ● addCalculateDiscountPriceMethod(storeItem) › should return the discount price from the new 'calculateDiscountPrice' method

我已多次重写此代码,试图通过npm测试。我尝试使用括号表示法以及在一行上返回明显简单的计算(返回价格 - (价格* discountPercentage)),并且除了原始尝试之外,这两个重试都在现场终端上正常工作nodejs会话。

那么为什么它不能用于npm测试?我没看到什么?

更新:这是来自npm测试文件的相关测试代码:

describe('addCalculateDiscountPriceMethod(storeItem)', function() {
  var storeItem = {
    price: 80,
    discountPercentage: 0.1
  };
  var storeItem2 = {
    price: 5,
    discountPercentage: 0.5
  };

  it('should add the method \'calculateDiscountPrice\' to the store item  object', function() {
  expect(exercises.addCalculateDiscountPriceMethod(storeItem).calculateDiscountPrice).toBeDefined();
 expect(exercises.addCalculateDiscountPriceMethod(storeItem2).calculateDiscount Price).toBeDefined();
  });
  it('should return the discount price from the new \'calculateDiscountPrice\' method', function() {
expect(exercises.addCalculateDiscountPriceMethod(storeItem).calculateDiscountPrice()).toBe(72);
expect(exercises.addCalculateDiscountPriceMethod(storeItem2).calculateDiscountPrice()).toBe(2.5);
  });
});

1 个答案:

答案 0 :(得分:1)

输出已经告诉你storeItem是未定义的,因为它是函数参数,你在尝试添加函数之前没有做任何事情,那么问题必须是测试本身。

查看测试文件并检查参数是否传递给您的函数。或者使用

console.log(arguments); 

在函数内部,arguments是一个保留字,包含传递给函数调用的参数。

编辑:查看测试是否正在链接这两个电话

addCalculateDiscountPriceMethod(storeItem)
    .calculateDiscountPrice()

由于您没有返回任何内容,因此它在undefined上调用calculateDisconutPrice,因此您必须在addCalculateDiscountPriceMethod中返回storeItem。