我正在测试自己的fromApi
函数:
// @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());
});
});
});
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
的定义。
如果有人可以把头缠住,足以告诉我这个问题值得一谈,因为它首先是由于缺少一些愚蠢的东西,所以我对此持开放态度。或通过指出我所缺少的愚蠢事物来回答它。