使用 chai 和 supertest 测试节点 js 路由器失败

Testing node js router with with chai and supertest fails

我正在尝试测试接收信息并保存到 mysql 数据库的 post 请求。

这是路由器。

router.post('/dbInsert',(req,res,next)=>{
   user = req.body;
   saveUser(user).then((result)=>{
       res.send('All info saved');
    }).catch((e)=>{
       res.send('All info not saved');
   });
});

路由器正常工作,因为我试图 post 数据进入它。

所以现在当我尝试 运行 测试时,它说错误。这是测试。

describe('POST /dbInsert',()=>{
    it('should create a new user',(done)=>{
        var fake = {
            Owner : "3",
            firstname : "bla",
            lastname : "wassup",
            email:"unvalid@email.com",
            password : "akhjashjkdadh",
            token : "121212121"
        }
        request(app)
            .post('/dbInsert')
            .send(fake)
            .expect(200)
            .expect((res)=>{
                expect(res.body).to.include(fake);
            })

            .end((err,res)=>{
                if(err)
                    return done(err);
            });
    });
});

这里是错误。

1 failing

  1) POST /dbInsert should create a new user:
     AssertionError: expected {} to have property 'Owner'

/* Not related to the above question but just curious */

我是新手,也想问一下,如何克隆数据库,因为不是在我自己的数据库上测试而是有一个假数据库来测试这个然后自己被删除。我看着间谍,但不知道这是否是这样做的方式。

超测并不像您想象的那样。这不会对您发送到服务器的内容进行单元测试。这会测试您服务器的响应,因此它不会是您发送的对象。

.expect((res)=>{
    expect(res.body).to.include(fake);
})

如果您在路由中调用 res.send(body),您应该能够像这样验证它:

.end((err, res) => {
    if (err) return done(err);
    expect(res.body).to.have.property("Owner").that.equal("3");
    return done();
})

我看到的另一个问题是您没有正确处理错误。在您的情况下,如果出现错误,您将发送 200,这意味着您不知道它何时失败,这可能就是更新的验证似乎无法正常工作的原因。

.catch((e)=>{ // 唯一不同的是消息。 res.send('All info not saved'); });

试试这个:

.catch((e)=>{ // 现在,它将是一个 500 来记录失败 res.status(500).发送(e.message); });

这将在成功时超时,因为您只会在出现错误时调用 done。只需删除 if 语句。

.end((err,res)=>{
    if(err)
        return done(err);
});

这应该有效:

.end(done);

整个十帮:

router.post('/dbInsert',(req,res,next)=>{
   user = req.body;
   saveUser(user).then((result)=>{
       res.send(user);
       next();
    }).catch((e)=>{
       res.status(500).send(e.message);
       next();
   });
});

describe('POST /dbInsert',()=>{
    it('should create a new user',(done)=>{
        var fake = {
            Owner : "3",
            firstname : "bla",
            lastname : "wassup",
            email:"unvalid@email.com",
            password : "akhjashjkdadh",
            token : "121212121"
        }
        request(app)
            .post('/dbInsert')
            .send(fake)
            .expect(200)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body).to.have.property('Owner').that.equal(fake.Owner);
                done();
            });
    });
});

为了测试,我验证了这个有效:

const request = require('supertest');
const express = require('express');
const bodyParser = require('body-parser');
const expect = require('chai').expect;
const app = express();

app.use(bodyParser.json());

app.post('/user', function(req, res) {
  return res.send(req.body);
});

request(app)
  .post('/user')
  .send({
      foo: "bar"
  })
  .expect(200)
  .end(function(err, res) {
    if (err) throw err;
    expect(res.body.foo).to.equal("bar");
  });

如果还是不行,一定是有什么看不见的事情发生了。如果无法查看输出,请尝试 console.dir(res.body)