我正在尝试使用mocha运行我的测试脚本,但是出现错误“参考错误:beforeEach未定义”

时间:2019-01-26 20:00:47

标签: javascript node.js testing mocha

Mocha测试套件给出了参考错误,并指出“未定义每个行为”

我正在尝试使用mocha在node.js中为待办事项应用程序运行测试脚本。但是有一个参考错误,它说“ beforeEach未定义”

const {app} = require('./../server');
const {Todo} = require('./../models/todo');

beforeEach((done) => {
  Todo.remove({}).then(() => done());
});

describe('POST /todos', () => {
  it('should create a new todo', (done) => {
    var text = 'Test todo text';

request(app)
  .post('/todos')
  .send({text})
  .expect(200)
  .expect((res) => {
    expect(res.body.text).toBe(text);
  })
  .end((err, res) => {
    if (err) {
      return done(err);
    }

    Todo.find().then((todos) => {
      expect(todos.length).toBe(1);
      expect(todos[0].text).toBe(text);
      done();
        }).catch((e) => done(e));
      });
  });

  it('should not create todo with invalid body data', (done) => {
request(app)
  .post('/todos')
  .send({})
  .expect(400)
  .end((err, res) => {
    if (err) {
      return done(err);
    }

    Todo.find().then((todos) => {
      expect(todos.length).toBe(0);
      done();
    }).catch((e) => done(e));
  });
  });
});

此外,我还为package.json文件提供了所有必需的软件包。

我的Package.json文件在下面给出

{
  "name": "todo-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
  "test": "mocha server/**/*.test.js",
    "test-watch": "nodemon --exec 'npm test' "
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "bluebird": "^3.5.3",
    "body-parser": "^1.15.2",
    "express": "^4.14.0",
    "mongodb": "^2.2.5",
    "mongoose": "^4.5.9"
  },
  "devDependencies": {
    "expect": "^1.20.2",
    "mocha": "^3.0.2",
    "nodemon": "^1.10.2",
    "supertest": "^2.0.0"
  }
}

2 个答案:

答案 0 :(得分:0)

我刚刚尝试使用您的package.json文件通过简单的存储库来复制您的测试问题。我的测试文件

const expect = require('expect');

beforeEach((done) => {
  done();  
});

describe('just a test', function() {
  it('test', function() {
    expect(true).toBe(true);
  })
});

然后,在运行npm t时,测试已成功执行。

enter image description here

也许您的项目中配置错误。

答案 1 :(得分:0)

在我看来,您正在尝试在每次对Todo应用程序进行新测试之前清除MongoDB数据库中的数据。因此,您想找到todo的集合并将所有内容放入下一个测试之前,如果是这样的话

beforeEach(() => {
 mongoose.connection.collections.todo
});

使用上述方法,您可以直接引用数据库中的todo集合,并在drop()集合上调用todo函数。

beforeEach(() => {
  mongoose.connection.collections.todo.drop();
});

请告诉我我是否满足您的要求。请记住,这是一个异步操作,因此您需要确保暂停整个测试环境,直到操作完成为止,但是您已经知道这一点,因为您已经尝试实现done回调。

此外,drop()将接受如下回调函数:

beforeEach((done) => {
  mongoose.connection.collections.todo.drop(() => {});
});

只有在完成收集后,该函数才会执行。因此,您还必须像这样定义后传递done()回调:

beforeEach((done) => {
   mongoose.connection.collections.todo.drop(() => {
     done();
   });
});

此外,当您运行Mocha测试时,您也会执行npm run test