Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jestjs 如何使用jest测试objective.js?_Jestjs_Objection.js - Fatal编程技术网

Jestjs 如何使用jest测试objective.js?

Jestjs 如何使用jest测试objective.js?,jestjs,objection.js,Jestjs,Objection.js,我想测试users控制器的getUsers方法。它从usersModel getUsers方法获取数据。我从MySQL获取数据 Model.knex(knex); const app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(i18nextMiddleware); 根据说明,我正在更改查询方法 app.get( '/',

我想测试users控制器的getUsers方法。它从usersModel getUsers方法获取数据。我从MySQL获取数据

Model.knex(knex);

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(i18nextMiddleware);
根据说明,我正在更改查询方法

app.get(
  '/',
  checkFilter(['type']),
  users.getUsers
);
描述测试

class MyQueryBuilder extends QueryBuilder {
  query() {
    return this.resolve({ test: 11111 });
  }
}

class UsersModel extends Model {
  static get QueryBuilder() {
    return MyQueryBuilder;
  }
}

jest.spyOn(Users, 'query')
  .mockImplementation(UsersModel.query);
方法获取用户模型的用户

describe('get errors', () => {
  beforeAll(done => {
    i18next.on('initialized', () => {
      done()
    });
  });

  it('with filter', done => {
    request(app)
      .get('/')
      .query({page: 0, perPage: 5, type: 'admin'})
      .end((err, res) => {
        if (err) return done(err);

        expect(res.status).toBe(200);
        expect(
          Object.keys(res.body).sort()
        ).toEqual([
          'items',
          'itemsOnPage',
          'currentPage',
          'totalPage',
          'totalItems'
        ].sort());
        expect(res.body.items).toHaveLength(8);
        expect(res.body.totalItems).toBe(usersMockDB.getUsers.length);

        console.log(res.body);

        done();
      });
  });

  afterAll(done => {
    knex.destroy();

    done();
  })
});


我应该覆盖方法页面和何处?据我所知,他们会进行新的数据库查询。

这可能不是所有情况下都需要的,但我发现对于使用异议模型的单元测试,最简单的解决方案是每个测试创建一个事务。这意味着您将需要一个数据库来运行测试,但在测试之间会回滚所有内容

jest.config.js
中,添加这一行

setupfileafterenv:['./jest.setup.js'],
jest.setup.js
中:

从“异议”导入异议;
从“./src/db/index.js”导入knex;//将src/db/index.js更改为导出knex实例的文件路径
const{transaction,Model}=异议;
全局.beforeAll(异步()=>{
global.knex=knex;
global.txn=null;
});
全局.beforeach(异步()=>{
global.txn=等待事务.start(knex);
Model.knex(global.txn);
});
全局.afterEach(异步()=>{
等待global.txn.rollback();
模型.knex(knex);
});
global.afterAll(异步()=>{
global.knex.destroy();
});
然后,您可以在代码和单元测试中使用预期的模型

从'/src/db/models/index.js'导入{User};
它('创建和读取用户',异步()=>{
const user=wait user.query().insert({email:'test@test.com'});
const users=wait User.query();
expect(用户)。toHaveLength(1);
});
它('在测试之间不持久化用户',异步()=>{
const users=wait User.query();
expect(用户)。toHaveLength(1);
});
    const { Users } = require('../../db/models/Users');

    const query = Users
      .query()
      .select(
        'id',
        'login',
        'type',
        'edit',
        'email',
        'phone',
        'block'
      )
      .orderBy('id', 'DESC')
      .page(page, perPage);

    // filter

    if (Object.keys(usersFilter).length) {
      for (let field in usersFilter) {
        if ( usersFilter.hasOwnProperty(field) ) {
          query.where(field, 'like', `%${ usersFilter[field] }%`);
        }
      }
    }

    const { results, total } = await query;

    return {
      items:       results,
      itemsOnPage: Number(perPage),
      currentPage: Number(page),
      totalPage:   Math.ceil(total/perPage),
      totalItems:  Number(total)
    }