我正在学习如何用Jest(可能是Sinon来)测试Apollo服务器。
不久之前,我刚刚学习完Apollo GraphQL,并做了一个简单的CRUD项目。
我采用了自己的方法,而不是像Apollo服务器showed那样添加datasources
,而是使它们发挥作用。
// user.service.ts
const resolver = {
Query: {
sellers: () => query.index(),
seller: (_root: any, { id }: { id: number }) => query.show({ id }),
}
}
export default resolver
// user.query.ts
const query = {
// Find all sellers
async index() {
// Query in database
const result: Seller[] = await service.findAll()
// Return sellers
return result
},
// Find one seller by id
async show({ id }: { id: number }) {
// Query by id in database
const result: Seller = await service.findOneById(id)
// Return found seller
return result
}
}
export default query
// user.service.ts
const service = {
async findAll(): Promise<Seller[]> {
// Get sellers from db
const sellers = knex('seller').select()
// Return sellers array
return sellers
},
async findOneById(id: number): Promise<Seller> {
// Get a seller by id
const seller = knex('seller')
.where('id', id)
.first()
// Return seller object
return seller
}
}
export default service
现在我在测试方面遇到了麻烦。 我不知道在哪里添加模拟功能。
通常使用REST
的{{1}} API:
Sinon
// controller.js
module.exports = {
// A func that takes in two parameters `req` and `res` [request, response]
getIndexPage: (req, res) => {
res.send("Hey");
}
}
我将它们用作函数的原因是我不知道如何在// controller.test.js
const indexPage = require("./controller.js");
describe("getIndexPage", function() {
it("should send hey", function() {
let req = {}
// Have `res` have a send key with a function value coz we use `res.send()` in our func
let res = {
// Replace empty function with a spy
send: sinon.spy()
}
indexPage.getIndexPage(req, res);
// Let's see what we get on res.send
console.log(res.send);
// `res.send` called once
expect(res.send.calledOnce).to.be.true;
// Expect to get argument `bla` on first call
expect(res.send.firstCall.args[0]).to.equal("bla");
});
});
文件中分隔代码(一个文件中的所有查询和突变),并且代码还在不断增长(超过200行)。尽管它们是函数,但我可以分隔代码,例如datasource
中的查询和query.ts
中的突变。
我应该继续使用这些功能吗?如果是这样,我该如何测试呢?
请帮助我。