首页 > 解决方案 > proxyquire 错误:ENOENT:没有这样的文件或目录,scandir

问题描述

你好,我是新来的测试mocha/chai/sinon and sequelize-test-helpers

试图用来proxyquire覆盖require但有问题

收到有关路径的以下错误:

Error: ENOENT: no such file or directory, scandir 'C:<local-directories-path>\ecommerce-pern-app\server\src\models'

我不明白为什么有一个src folder当我根本没有src folderproxyquire在测试文件中使用它的时候,它的路径来自server目录将是:

服务器/specs/services/user-service.spec.js

"use strict";
const chai = require('chai');
const {match, stub, resetHistory, spy} = require('sinon');
const proxyquire = require('proxyquire');
const path = require('path');
const service = path.resolve('./services/userService.js')
var sinonChai = require("sinon-chai");
chai.should();
chai.use(sinonChai);

console.log(service)

const {makeMockModels, sequelize, dataTypes,} = require('sequelize-test-helpers');

describe('Idea Controller', function () {

  const uid = '6a88e9b5-33a2-403f-ac3d-e86413ac101d'
  const data = {
    email: 'testface@test.com',
    password: '123456',
    is_admin: false,
    first_name: 'Testy',
    last_name: 'McTestface', 
    google_id: null,
    facebook_id: null
  }

    describe('findAll()', function () {
        it('Success case ', function () {

            const mockResponse = () => {
                const res = {};
                res.json = stub().returns(res);
                return res;
            };

            let res = mockResponse();

            const User = {findAll: stub()};
            const mockModels = makeMockModels({User});

            Idea.findAll.resolves(data);

            const UserService = proxyquire(service, {
              "save": {}
            });

            UserService.findAll({}, res);

            Idea.findAll.should.have.been.called; // passes
            res.json.should.have.been.called; //fails
        });
    })
});

在上面的代码中,我使用了这样的 proxyquire:

const proxyquire = require('proxyquire');
const path = require('path');
const service = path.resolve('./services/userService.js')
const {makeMockModel} = require('sequelize-test-helpers');

            const mockModels = makeMockModels({User});

            const UserService = proxyquire(service, {
              "../models": mockModels
            });

当我试图使用路径来查找server/service/userService.js相对位于测试文件中的文件时../../services/userService.jssrc folder当我什至根本没有时,我就有了这个错误src directory

正如错误所说:

Error: ENOENT: no such file or directory, scandir 'C:<local-directories-path>\ecommerce-pern-app\server\src\models'

无论我尝试什么文件路径都不起作用我尝试了 path.resolve、path.join 并直接将路径输入其中../../services/userService.js

这是服务器/服务/userService.js

const Models = require('../models');
const { User } = Models;

const save = async ({ id, ...data }) => {
  const user = await User.findOne({ where: { uid: id } })
  if (user) return await user.update(data)
  return null
}


module.exports = save;

我只希望使用 proxyquire 的路径工作

错误中的 \src\models 路径是什么,我根本没有 src/models 路径!

标签: javascriptunit-testingsequelize.jssinonproxyquire

解决方案


这是从sequelize-test-helpers 的自述文件中引用的。

为方便起见,makeMockModels 将自动使用src/models 文件夹中定义的所有模型的模拟填充您的模拟模型(或者如果您有一个 .sequelizerc 文件,它将在其中查找模型路径)。只需覆盖您需要处理的任何特定模型。

所以你需要提供 .sequelizerc 文件并定义models-path.


推荐阅读