无法在明确定义的属性上读取未定义的属性X

时间:2019-07-01 14:05:16

标签: javascript jestjs

我正在测试自己的fromApi函数:

deal.test.js

// @flow
import Deal from "../src/models/Deal";
import apiProducts from "../__mocks__/api/products";

describe("Deal", () => {
  describe("Deal.fromApi", () => {
    it("takes an api product and returns a Deal", () => {
      const apiDeal = apiProducts[0];
      expect(Deal.fromApi(apiDeal)).toEqual(expectedDeal());
    });
  });
});

Deal.js

export default class Deal {
  constructor(obj: Object) {
    console.log("id", obj.id);
    // console.log(obj);

    this.id = obj.id;
    this.name = obj.name;
    this.headline = obj.headline;
    this.fullPrice = obj.fullPrice;
    this.salePrice = obj.salePrice;
    this.photoUrls = obj.photoUrls;
    this.description = obj.description;
    this.address = obj.address;
    this.location = obj.location;
  }

  static fromApi(json: Object): Deal {
    return new Deal(json);
  }
}

测试距离通过还有很长的路要走,因为api输入对象具有很多属性尚未在构造函数中说明,但这不是我的问题。

测试在第一行失败:

 ● Deal › Deal.fromApi › takes an api product and returns a Deal

    TypeError: Cannot read property 'id' of undefined

      16 | 
      17 |   constructor(obj: Object) {
    > 18 |     console.log("id", obj.id);
         |                           ^
      19 | 
      20 |     // console.log(obj);
      21 | 

但是控制台可以打印id很好!另外,当我记录整个对象时,它正在按预期记录整个对象!这一切都是在日志语句之前开始的,这时测试将在第一行(this.id = obj.id)失败,并且相同的错误只是指向obj在另一个位置。

obj未定义。为什么会这样?

更新

当我开始实际充实fromApi方法时,从一个空交易(const deal = new Deal()开始),我在构造函数中得到了一个实际上未定义的obj参数,这显然是会发生的当您不将参数传递给构造函数时。

所以我添加了:

if (!obj) return;

位于构造函数的顶部,现在一切正常。

不知道是否确实“解决”了我的“原始”问题,因为那时控制台再次确认了obj的定义。

如果有人可以把头缠住,足以告诉我这个问题值得一谈,因为它首先是由于缺少一些愚蠢的东西,所以我对此持开放态度。或通过指出我所缺少的愚蠢事物来回答它。

0 个答案:

没有答案