使用 Sinon.js 进行服务层单元测试 - 错误 "x" 不是构造函数
Service Layer Unit testing with Sinon.js - Error "x" is not a constructor
我遵循了媒体指南:
https://medium.com/@tehvicke/integration-and-unit-testing-with-jest-in-nodejs-and-mongoose-bd41c61c9fbc 正在尝试开发测试套件。我的代码和他的完全一样,但我有 TypeError: Tournament is not a constructor
我放了一些代码,所以你可以看到我在做什么。
TournamentService.js
const createTournament = (Tournament) => (tournamentObj) => {
const {name, creator} = tournamentObj;
const newTournament = new Tournament({name, creator});
return newTournament.save();
};
TournamentService.test.js
const TournamentService = require("../TournamentService");
const sinon = require("sinon");
describe("create Tournament test", () => {
it("creates a tournament", () => {
const save = sinon.spy();
console.log("save ", save);
let name;
let creator;
const MockTournamentModel = (tournamentObject) => {
name = tournamentObject.name;
creator = tournamentObject.creator;
return {
...tournamentObject,
save,
};
};
const tournamentService = TournamentService(MockTournamentModel);
const fintoElemento = {
name: "Test tournament",
creator: "jest",
};
tournamentService.createTournament(fintoElemento);
const expected = true;
const actual = save.calledOnce;
expect(actual).toEqual(expected);
expect(name).toEqual("Test tournament");
});
});
我发现了错误,问题是我试图用箭头函数创建 MockTournamentModel,而你应该使用经典函数(或一些重新编译成经典函数的包)
关键字 new 做了一些事情:
它创建了一个新对象。这个对象的类型只是object.
- 它设置这个新对象的内部的、不可访问的、[[prototype]](即
__proto__) 属性 成为构造函数的外部可访问原型对象(每个函数对象自动具有
原型 属性).
- 它使 this 变量指向新创建的对象。
- 它执行构造函数,使用新创建的对象
每当提到这个。
- 它returns新创建的对象,除非构造函数
returns 非空对象引用。在这种情况下,那个对象
而是返回引用。
箭头函数根本没有 this、arguments 或其他特殊名称绑定。
这就是它不能使用箭头函数的原因。希望这能帮助其他人避免我的错误!
https://zeekat.nl/articles/constructors-considered-mildly-confusing.html
我遵循了媒体指南: https://medium.com/@tehvicke/integration-and-unit-testing-with-jest-in-nodejs-and-mongoose-bd41c61c9fbc 正在尝试开发测试套件。我的代码和他的完全一样,但我有 TypeError: Tournament is not a constructor
我放了一些代码,所以你可以看到我在做什么。
TournamentService.js
const createTournament = (Tournament) => (tournamentObj) => {
const {name, creator} = tournamentObj;
const newTournament = new Tournament({name, creator});
return newTournament.save();
};
TournamentService.test.js
const TournamentService = require("../TournamentService");
const sinon = require("sinon");
describe("create Tournament test", () => {
it("creates a tournament", () => {
const save = sinon.spy();
console.log("save ", save);
let name;
let creator;
const MockTournamentModel = (tournamentObject) => {
name = tournamentObject.name;
creator = tournamentObject.creator;
return {
...tournamentObject,
save,
};
};
const tournamentService = TournamentService(MockTournamentModel);
const fintoElemento = {
name: "Test tournament",
creator: "jest",
};
tournamentService.createTournament(fintoElemento);
const expected = true;
const actual = save.calledOnce;
expect(actual).toEqual(expected);
expect(name).toEqual("Test tournament");
});
});
我发现了错误,问题是我试图用箭头函数创建 MockTournamentModel,而你应该使用经典函数(或一些重新编译成经典函数的包)
关键字 new 做了一些事情:
它创建了一个新对象。这个对象的类型只是object.
- 它设置这个新对象的内部的、不可访问的、[[prototype]](即 __proto__) 属性 成为构造函数的外部可访问原型对象(每个函数对象自动具有 原型 属性).
- 它使 this 变量指向新创建的对象。
- 它执行构造函数,使用新创建的对象 每当提到这个。
- 它returns新创建的对象,除非构造函数 returns 非空对象引用。在这种情况下,那个对象 而是返回引用。
箭头函数根本没有 this、arguments 或其他特殊名称绑定。
这就是它不能使用箭头函数的原因。希望这能帮助其他人避免我的错误!
https://zeekat.nl/articles/constructors-considered-mildly-confusing.html