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

时间:2017-09-10 15:21:55

标签: node.js express mocha chai

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

这是路由器。

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');
   });
});

路由器正常工作,因为我试图将数据发布到其中。

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

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 */

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

1 个答案:

答案 0 :(得分:1)

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

.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('所有信息未保存');    });

试试这个:

.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)