柴:期望对象具有类似(格式)的对象数组
chai: expect object to have array of objects like (in format)
我正在尝试使用 TDD 为 node.js 应用程序编写测试,但我不知道如何为我的 Products Route get()
函数编写 chai expect 测试。
// productsController.js
let items = [
{
id: 1,
name: 'Product 1',
description: 'Product1 description',
price: 19.00
}
];
module.exports = {
get(_, res) {
res.json({items});
}
};
我已经阅读了几次文档,但我似乎不太明白如何测试响应对象是否应包含键 items
,其中值为 [= 'products'
的 14=] 具有上述架构。
我尝试过的:
// products.test.js
const { get, getById } = require('../../routes/productsController');
const res = {
jsonCalledWith: {},
json(arg) {
this.jsonCalledWith = arg
}
}
describe('Products Route', function() {
describe('get() function', function() {
it('should return an array of products ', function() {
get(req, res);
expect(res.jsonCalledWith).to.be.have.key('items').that.contains.something.like({
id: 1,
name: 'name',
description: 'description',
price: 18.99
});
});
});
});
但是,我收到此错误:
AssertionError: expected { Object (items) } to be an array
有谁知道我怎样才能成功编写这个测试?
我认为您收到错误是因为预期的输出是一个数组,要完成您需要的测试:
it('Check route list all users', (done) => {
api.get('/usuarios')
.set('Accept', 'application/json; charset=utf-8')
.expect(200)
.end((err, res) => {
expect(res.body).to.be.an('array');
expect(res.body.length).to.equal(1);
done();
});
});
这是一个 returns 数组作为 json 响应的示例。
这是对来自路由的对象 User
实例的相同测试:
it('Check get by id return 200', (done) => {
api.get('/usuarios/1')
.set('Accept', 'application/json; charset=utf-8')
.expect(200)
.end((err, res) =>{
expect(res.body).to.have.property('nome');
expect(res.body.nome).to.equal('abc');
expect(res.body).to.have.property('email');
expect(res.body.email).to.equal('a@a.com');
expect(res.body).to.have.property('criacao');
expect(res.body.criacao).to.not.equal(null);
expect(res.body).to.have.property('atualizado');
expect(res.body.atualizado).to.not.equal(null);
expect(res.body).to.have.property('datanascimento');
expect(res.body.datanascimento).to.not.equal(null);
expect(res.body).to.have.property('username');
expect(res.body.username).to.equal('abcdef');
expect(res.body).to.have.property('statusmsg');
expect(res.body.statusmsg).to.equal('status');
expect(res.body).to.have.property('genero');
expect(res.body.genero).to.equal('M');
expect(res.body).to.have.property('descricao');
expect(res.body.descricao).to.equal('descricao');
done();
});
});
在我的示例中,我使用了 mocha
和 chai
以及 supertest
。
希望对您有所帮助,如果您需要更多说明,请告诉我。
我想通了!
// products.test.js
const chai = require('chai');
chai.use(require('chai-json-schema'));
const expect = chai.expect;
const { get } = require('../../routes/productsController');
let req = {
body: {},
params: {},
};
const res = {
jsonCalledWith: {},
json(arg) {
this.jsonCalledWith = arg
}
}
let productSchema = {
title: 'productSchema',
type: 'object',
required: ['id', 'name', 'description', 'price'],
properties: {
id: {
type: 'number',
},
name: {
type: 'string'
},
description: {
type: 'string',
},
price: {
type: 'number',
},
}
};
describe('Products Route', function() {
describe('get() function', function() {
it('should return an array of products ', function() {
get(req, res);
expect(res.jsonCalledWith).to.be.have.key('items');
expect(res.jsonCalledWith.items).to.be.an('array');
res.jsonCalledWith.items.forEach(product => expect(product).to.be.jsonSchema(productSchema));
});
});
});
原来插件 chai-json-schema 允许验证 json 对象以满足预定义的模式。
我正在尝试使用 TDD 为 node.js 应用程序编写测试,但我不知道如何为我的 Products Route get()
函数编写 chai expect 测试。
// productsController.js
let items = [
{
id: 1,
name: 'Product 1',
description: 'Product1 description',
price: 19.00
}
];
module.exports = {
get(_, res) {
res.json({items});
}
};
我已经阅读了几次文档,但我似乎不太明白如何测试响应对象是否应包含键 items
,其中值为 [= 'products'
的 14=] 具有上述架构。
我尝试过的:
// products.test.js
const { get, getById } = require('../../routes/productsController');
const res = {
jsonCalledWith: {},
json(arg) {
this.jsonCalledWith = arg
}
}
describe('Products Route', function() {
describe('get() function', function() {
it('should return an array of products ', function() {
get(req, res);
expect(res.jsonCalledWith).to.be.have.key('items').that.contains.something.like({
id: 1,
name: 'name',
description: 'description',
price: 18.99
});
});
});
});
但是,我收到此错误:
AssertionError: expected { Object (items) } to be an array
有谁知道我怎样才能成功编写这个测试?
我认为您收到错误是因为预期的输出是一个数组,要完成您需要的测试:
it('Check route list all users', (done) => {
api.get('/usuarios')
.set('Accept', 'application/json; charset=utf-8')
.expect(200)
.end((err, res) => {
expect(res.body).to.be.an('array');
expect(res.body.length).to.equal(1);
done();
});
});
这是一个 returns 数组作为 json 响应的示例。
这是对来自路由的对象 User
实例的相同测试:
it('Check get by id return 200', (done) => {
api.get('/usuarios/1')
.set('Accept', 'application/json; charset=utf-8')
.expect(200)
.end((err, res) =>{
expect(res.body).to.have.property('nome');
expect(res.body.nome).to.equal('abc');
expect(res.body).to.have.property('email');
expect(res.body.email).to.equal('a@a.com');
expect(res.body).to.have.property('criacao');
expect(res.body.criacao).to.not.equal(null);
expect(res.body).to.have.property('atualizado');
expect(res.body.atualizado).to.not.equal(null);
expect(res.body).to.have.property('datanascimento');
expect(res.body.datanascimento).to.not.equal(null);
expect(res.body).to.have.property('username');
expect(res.body.username).to.equal('abcdef');
expect(res.body).to.have.property('statusmsg');
expect(res.body.statusmsg).to.equal('status');
expect(res.body).to.have.property('genero');
expect(res.body.genero).to.equal('M');
expect(res.body).to.have.property('descricao');
expect(res.body.descricao).to.equal('descricao');
done();
});
});
在我的示例中,我使用了 mocha
和 chai
以及 supertest
。
希望对您有所帮助,如果您需要更多说明,请告诉我。
我想通了!
// products.test.js
const chai = require('chai');
chai.use(require('chai-json-schema'));
const expect = chai.expect;
const { get } = require('../../routes/productsController');
let req = {
body: {},
params: {},
};
const res = {
jsonCalledWith: {},
json(arg) {
this.jsonCalledWith = arg
}
}
let productSchema = {
title: 'productSchema',
type: 'object',
required: ['id', 'name', 'description', 'price'],
properties: {
id: {
type: 'number',
},
name: {
type: 'string'
},
description: {
type: 'string',
},
price: {
type: 'number',
},
}
};
describe('Products Route', function() {
describe('get() function', function() {
it('should return an array of products ', function() {
get(req, res);
expect(res.jsonCalledWith).to.be.have.key('items');
expect(res.jsonCalledWith.items).to.be.an('array');
res.jsonCalledWith.items.forEach(product => expect(product).to.be.jsonSchema(productSchema));
});
});
});
原来插件 chai-json-schema 允许验证 json 对象以满足预定义的模式。