由于某种原因proxquire找不到我的模块index.js。我一定是在做一些非常愚蠢或明显的事情而无法看到它。
错误:
invoicer
good request
1) "before all" hook
0 passing (9ms)
1 failing
1) invoicer good request "before all" hook:
Error: Cannot find module '../index.js'
at Function.Module._resolveFilename (module.js:338:15)
at Proxyquire._disableModuleCache (/Users/mario/projects/_invoice/print-invoice/node_modules/proxyquire/lib/proxyquire.js:218:19)
at Proxyquire._disableCache (/Users/mario/projects/_invoice/print-invoice/node_modules/proxyquire/lib/proxyquire.js:203:15)
at Proxyquire._withoutCache (/Users/mario/projects/_invoice/print-invoice/node_modules/proxyquire/lib/proxyquire.js:173:27)
at Proxyquire.load (/Users/mario/projects/_invoice/print-invoice/node_modules/proxyquire/lib/proxyquire.js:135:15)
at getTestedModule (/Users/mario/projects/_invoice/print-invoice/test/test.js:89:12)
at Context.<anonymous> (/Users/mario/projects/_invoice/print-invoice/test/test.js:69:28)
at Hook.Runnable.run (/usr/local/lib/node_modules/mocha/lib/runnable.js:218:15)
at next (/usr/local/lib/node_modules/mocha/lib/runner.js:259:10)
at Object._onImmediate (/usr/local/lib/node_modules/mocha/lib/runner.js:276:5)
at processImmediate [as _immediateCallback] (timers.js:345:15)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,我对另一个应用程序的测试进行了相同的设置,并且在那里找到模块没有问题。我什至维护了相同版本的proxyquire,将其更改为最新版本仍然没有修复它。index.js存在于指定路径的目录中。
这是我的测试代码:
var chai = require('chai');
var sinonChai = require("sinon-chai");
var …Run Code Online (Sandbox Code Playgroud) 我有一个课AProvider要求'./b.provider'.
const BProvider = require('./b.provider');
class AProvider {
static get defaultPath() {
return `defaults/a/${BProvider.getThing()}`;
}
}
module.exports = AProvider;
Run Code Online (Sandbox Code Playgroud)
b.provider.js毗邻a.provider.js并且看起来像
global.stuff.whatever = require('../models').get('Whatever'); // I didn't write this!
class BProvider {
static getThing() {
return 'some-computed-thing';
}
}
module.exports = BProvider;
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我使用如下proxyquire模拟./b.provider:
import { expect } from 'chai';
import proxyquire from 'proxyquire';
describe('A Provider', () => {
const Provider = proxyquire('../src/a.provider', {
'./b.provider': {
getThing: () => 'b-thing'
}, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用proxyquire替换私有函数,以便在我的 Meteor 应用程序中进行测试。
流星1.6.1
流星测试:mocha@1.1.2
在我的parentFunction.js中:
import { some function } from 'anotherFile';
function childFunction() {
...
return someValue;
}
export default function parentFunction() {
return childFunction()
}
Run Code Online (Sandbox Code Playgroud)
在我的测试文件中:
const proxyquire = require('proxyquire');
if (Meteor.isServer) {
...
describe('parentFunction', () => {
it('uses the mocked child function', () => {
const testThing = proxyquire('./parentFunction', {
'childFunction': () => ({ 'name': 'bob' }),
});
});
}
Run Code Online (Sandbox Code Playgroud)
ParentFunction.js 与我的测试文件位于同一文件夹中,为了仔细检查路径,我确保它有效:
import parentFunction from './parentFunction';
Run Code Online (Sandbox Code Playgroud)
但是当我运行测试时,我看到一个错误:
Error: Cannot find module './parentFunction.js'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我试过绝对路径,没用。据我从文档中看到,需要 proxiquire …
我有这些文件:
File1.js
var mod1 = require('mod1');
mod1.someFunction()
...
Run Code Online (Sandbox Code Playgroud)
File2.js
var File1 = require('./File1');
Run Code Online (Sandbox Code Playgroud)
现在在为File2编写单元测试时,是否可以进行mod1模拟,以便我不进行调用mod1.someFunction()?
您好,我正在尝试使用 proxyquire 模拟控制器内的模型。但由于某种原因,当尝试注入模拟时,原始文件被调用。
这就是控制器内部需要我的模型的方式:
var Product = require('./product.model');
Run Code Online (Sandbox Code Playgroud)
这就是我尝试存根模型的方式
var proxyquire = require('proxyquire').noCallThru().noPreserveCache();
var productsStub = {findAsync: sinon.stub()};
productsStub.findAsync.resolves(mockProducts);
var mockProducts = [{_id:'0001',title: 'title', price: 123, description: 'le description'}];
var productController = proxyquire('./product.controller',{'./product.model':productsStub});
Run Code Online (Sandbox Code Playgroud)
但是当我运行测试时我收到此错误
Running "mochaTest:unit" (mochaTest) task
>> Mocha exploded!
>> OverwriteModelError: Cannot overwrite `Product` model once compiled.
>> at Mongoose.model (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/mongoose/lib/index.js:360:13)
>> at Object.<anonymous> (/Users/victor/Documents/projects/estudo/mean/meanshop/server/api/product/product.model.js:15:27)
>> at Module._compile (module.js:409:26)
>> at normalLoader (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/babel-core/lib/api/register/node.js:199:5)
>> at Object.require.extensions.(anonymous function) [as .js] (/Users/victor/Documents/projects/estudo/mean/meanshop/node_modules/babel-core/lib/api/register/node.js:216:7)
>> at Module.load (module.js:343:32)
>> at Function.Module._load (module.js:300:12) …Run Code Online (Sandbox Code Playgroud) 假设我有一条由控制器处理的Express路线.控制器使用服务,服务使用存储库与数据源通信.
我想使用Supertest创建一个集成测试来测试该路由:
test -> my Express app -> controller -> service -> repository -> data source
Run Code Online (Sandbox Code Playgroud)
我的问题是我需要模拟存储库/数据源,来运行测试!我想硬编码一些值,好像它们来自真实的数据源.我有什么选择?
在Java世界中,我将使用Spring或Guice的依赖注入,我会用这样的模拟版本替换存储库.在Typescript/Node.js世界中实现这种模拟的模式是什么?
我想使用普通的Javascript我可以使用Proxyquire它的全局覆盖需要功能,从测试本身模拟存储库.但我不确定这适用于Typescript.
那么使用Typescript和Node.js从测试文件中模拟"深层"组件(传递依赖)的推荐方法是什么?
如何使用proxyquire和sinon存储以下模块:
var email = require("emailjs").server.connect.send();
Run Code Online (Sandbox Code Playgroud)
我做了以下,但它不起作用,因为当我尝试在其中触发错误send()时仍然发送电子邮件.
sendMailStub = sinon.stub(email, "send");
testedModule = proxyquire('../index.js', {
'email': {
'server': {
'send': sendMailStub
}
}
});
Run Code Online (Sandbox Code Playgroud)
并尝试过:
testedModule = proxyquire('../index.js', {
email: {send: sendMailStub}
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是完整的测试,但失败了:
var chai = require('chai');
var sinonChai = require("sinon-chai");
var sinon = require('sinon');
chai.use(sinonChai);
var proxyquire = require('proxyquire');
var testedModule;
var expect = chai.expect;
describe('invoicer', function () {
var nock = require('nock');
var ResponseOptions = {
username: "Peter Pan",
user_address_line_1: "Never Never Land",
user_address_line_2: "Tree-house 99", …Run Code Online (Sandbox Code Playgroud) 在测试模块 A 中的方法时,我使用 proxyquire 模拟模块 B 的方法(在模块 A 中注入了 require())。模拟(mocking ad.model.js 模块的 get_campaigns 方法):
const admitadModelMock = {
'../services/admitad.model': {
get_campaigns: (limit, page) => new Promise((resolve, reject) =>
setTimeout(resolve({campaigns: testData, count: 1000}), 5000)
),
},
};
Run Code Online (Sandbox Code Playgroud)
考试:
it('shold get all campaigns from Admitad', async function () {
this.timeout(60000);
let err, data;
// mock dependencie (get_campaigns() of module B will be mocked):
let $serviceStubbed = proxyquire('../services/campaign-sync', admitadModelMock);
// getAdmitadCampaigns() just calls get_campaigns method of module B
[err, data] = await to($serviceStubbed.getAdmitadCampaigns(50)); …Run Code Online (Sandbox Code Playgroud) 我试图让Proxyquire使用简单的方法替换,但我无法弄清楚我做错了什么.
我创建了lib.js.
module.exports = {
thing: () => {
console.log("thing");
}
};
Run Code Online (Sandbox Code Playgroud)
和test.js
const lib = require("./lib");
module.exports = () => {
lib.thing();
};
Run Code Online (Sandbox Code Playgroud)
并试图将依赖关系和替换东西与另一个函数,即
const proxyquire = require("proxyquire");
const libStub = {};
const test = proxyquire("./test", {"lib": libStub});
test();
libStub.thing = () => {
console.log("replaced");
};
test();
Run Code Online (Sandbox Code Playgroud)
但是测试在两次调用时都会记录"事物"而不是"替换".任何帮助表示赞赏.
我看过几个类似的问题,但没有一个案例适合我的问题。我正在尝试模拟我在其他测试中完成的构造函数,但是在使用 google-auth-library 的情况下我无法让它工作
代码.js
const {OAuth2Client} = require('google-auth-library');
const keys = require('./oauth2.keys.json');
async function getRedirectUrl() {
const oAuth2Client = new OAuth2Client(
keys.installed.client_id,
keys.installed.client_secret,
keys.installed.redirect_uris[0]
);
const authorizeUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: 'https://www.googleapis.com/auth/bigquery',
prompt: 'consent'
});
return authorizeUrl;
}
Run Code Online (Sandbox Code Playgroud)
测试.js
let Code = require('../code.js');
describe('code', function() {
let generateUrlStub, tokenStub, mockClient;
before(async () => {
generateUrlStub = sinon.stub().returns('http://example.com');
tokenStub = sinon.stub().returns({tokens: 'tokens'});
mockClient = sinon.stub().returns({
generateAuthUrl: generateUrlStub,
getToken: tokenStub,
});
Code = proxyquire('../Code.js', {
'google-auth-library': mockClient,
});
});
it('should call …Run Code Online (Sandbox Code Playgroud) 我有一个模块a
const b = require(./b);
function aGetResult() {
return b.getInfo();
}
Run Code Online (Sandbox Code Playgroud)
模块B
const c = require(./c);
function getInfo() {
return getDetailInfo();
}
function getDetailInfo() {
const result = c.getApiResult();
return result
}
Run Code Online (Sandbox Code Playgroud)
模块C
function getApiResult() {
return api.get(/test/1);
}
Run Code Online (Sandbox Code Playgroud)
我已经为模块 A 编写了一个测试,但遇到了存根依赖项的问题。我只想存根c.getApiResult()而不是b.getInfo()or b.getDetailInfo()。我尝试过有选择地使用存根proxyquire,但遇到了问题。有什么帮助吗?
对于下面的代码片段nodejs,我将如何send使用proxyquire和存根该方法sinon,因为它属于文件index.js?我尝试了很多方法,但经常出错.
var emailjs = require("emailjs");
emailjs.server.connect({
user: obj.user,
password: obj.password,
host: obj.host,
port: obj.port,
tls: obj.tls,
ssl: obj.ssl
})
.send(mailOptions, function(error, message){
if (error) {
console.log("ERROR");
context.done(new Error("There was an error sending the email: %s", error));
return;
} else {
console.log("SENT");
context.done();
return;
}
});
Run Code Online (Sandbox Code Playgroud)
到目前为止,在我的测试中,我有以下设置,但得到Uncaught TypeError: Property 'connect' of object #<Object> is not a function.
readFileStub = sinon.stub();
sendStub = sinon.stub();
connectStub = sinon.stub().returns(sendStub);
testedModule = proxyquire('../index', …Run Code Online (Sandbox Code Playgroud) 我似乎无法从 NodeJS 核心在 fs 上存根 readFileSync。以下代码隔离了该问题。通过 Mocha 运行测试结果如下:
> mocha tests/test.js
Some description
1) "before all" hook
0 passing (15ms)
1 failing
1) Some description "before all" hook:
TypeError: Cannot read property 'charCodeAt' of undefined
at Object.stripBOM (internal/module.js:48:14)
at Object.require.extensions.(anonymous function) (node_modules/proxyquire/lib/proxyquire.js:276:43)
at Proxyquire._withoutCache (node_modules/proxyquire/lib/proxyquire.js:179:12)
at Proxyquire.load (node_modules/proxyquire/lib/proxyquire.js:136:15)
at Context.<anonymous> (tests/test.js:12:15)
Run Code Online (Sandbox Code Playgroud)
这是测试/test.js
var proxyquire = require('proxyquire'),
sinon = require('sinon'),
fs = require('fs'),
sut;
describe('Some description', function () {
var readFileSyncStub;
before(function () {
readFileSyncStub = sinon.stub(fs, 'readFileSync');
readFileSyncStub.withArgs('someFile.js', { encoding: …Run Code Online (Sandbox Code Playgroud) proxyquire ×13
node.js ×10
unit-testing ×6
javascript ×4
sinon ×4
mocha.js ×3
testing ×3
es6-class ×1
meteor ×1
require ×1
supertest ×1
typescript ×1