根据文档,Sinon stub.returns() 方法不会返回正确的响应。有什么想法吗?
stubThis = sinon.stub().returns('123');
console.log(stubThis); // returns stub, but expect it to return 123
Run Code Online (Sandbox Code Playgroud) 我有一个 ES6 模块,我正在尝试为其编写测试,用于前端 React/Redux 应用程序。
这是在我的测试中困扰我的模块部分:
import 'aws-sdk/dist/aws-sdk';
import Bluebird from 'bluebird';
const AWS = window.AWS;
Run Code Online (Sandbox Code Playgroud)
这是我的测试的开始:
import chai from 'chai';
import { expect } from 'chai';
import chaiAsPromised from 'chai-as-promised';
import sinon from 'sinon';
chai.use(chaiAsPromised);
describe("S3Gateway", () => {
let awsStub;
let sandbox;
let writeObject;
beforeEach(() => {
sandbox = sinon.sandbox.create();
writeObject = require('../../../app/lib/aws/s3gateway').writeObject;
awsStub = sinon.stub().returns({
S3: sinon.stub().returns({
putObject: sinon.spy()
})
});
sandbox.stub(window, 'AWS', awsStub);
});
Run Code Online (Sandbox Code Playgroud)
我在终端窗口中运行 mocha 时不断出现在标准输出中的错误是:
$ mocha test/lib/aws/s3gateway.js --compilers js:babel-core/register
S3Gateway
1) "before each" …Run Code Online (Sandbox Code Playgroud) 我有一个反应组件,它接受一组对象并将它们映射到视图中的另一个反应组件中。我在测试它时运气不好,因为它给出了这个错误:
类型错误:data.map 不是函数
这是我写的测试。请注意我传递了 data 属性,我认为这应该使它起作用?
内容.test.js
import React from 'react';
import { shallow, mount } from 'enzyme';
import { expect } from 'chai';
import Content from '../components/Content.jsx';
describe('<Content />', () => {
const data = {
created: '2017-02-21T09:50:21.441815Z',
duration: 1575,
final_script: 'some script',
language: 'en-GB',
rating: 2,
url: 'some url',
};
it('renders without exploding', () => {
mount(<Content data={ data } />);
});
});
Run Code Online (Sandbox Code Playgroud)
这是组件本身
内容.jsx
function Content(props) {
const { data } = props;
return (
<div className='content_container'> …Run Code Online (Sandbox Code Playgroud) 我有一个模块:
let xmlParser = require('./myTools').xmlParser;
function extractDataAndWrite(xmldata) {
let doc = xmlParser(xmldata);
...
}
module.exports = {
extractDataAndWrite,
};
Run Code Online (Sandbox Code Playgroud)
xmlParser现在我想测试in的调用extractDataAndWrite:
var extractDataAndWrite = require('../services/importData.js').extractDataAndWrite;
var mytools = require('./myTools');
var sinon = require('sinon');
describe('Test extractDataAndWrite', function() {
it('call xmlParser', function(done) {
var xmlParserSpy = sinon.spy(mytools, 'xmlParser');
extractDataAndWrite("someXML");
console.log('xmlParserSpy: ' + xmlParserSpy.callCount);
done();
});
});
Run Code Online (Sandbox Code Playgroud)
我期望得到xmlParserSpy.callCount == 1但它是0!我的间谍无法工作,我必须改变什么?
我在 JS 中有一个工厂方法,可以为我的 node.js 应用程序创建一个对象。这个工厂方法接收一些参数,我想测试我是否正确创建了对象。
const LibX = require("libX");
const obj = deps => {
const { colorLib } = deps;
const hello = () => {
console.log(colorLib.sayHello()); // prints a phrase with cool colors
};
return {
hello
};
};
//Here I return `obj` with all dependencies included. Ready to use!
const objFactory = ({animal, owner = "max"}) => {
//For example,I need to know if phrase is being well constructed
const phrase = `${owner} from ${animal} …Run Code Online (Sandbox Code Playgroud) 我希望能够在每次测试的基础上存根我的中间件功能。正如此处阐明的,问题是我不能仅仅存根我的中间件函数,因为节点已经缓存了中间件函数,所以我不能存根它,因为我在一开始创建了我的应用程序。
const request = require("supertest");
const { expect } = require("chai");
const sinon = require('sinon');
const auth = require ("../utils/auth-middleware")
const adminStub = sinon.stub(auth, "isAdmin").callsFake((req, res, next) => next());
const app = require("../app.js"); // As soon as I create this, the middleware isAdmin function becomes cached and no longer mutable
Run Code Online (Sandbox Code Playgroud)
以上作为链接的SO答案中描述的解决方案,但我不喜欢那样为了恢复存根或修改假,我必须完全重新创建服务器。
我想知道是否有更好、更优雅的方法来解决 Node 首先缓存这些函数的事实require。我正在研究可能使用proxyquireordecache但两者似乎都提供了解决方法而不是可持续的解决方案(尽管我很可能在这里错了)。
假设我有一个像follow这样的功能。
import NetworkService from './services';
async function sendAPIRequest(data: any){
// validations
const service = new NetworkService();
await service.call(data)
}
Run Code Online (Sandbox Code Playgroud)
我的测试看起来像这样,它使用了 mocha、chai、sinon。
describe('sendAPIRequest', function(){
it('make api', async function(){
// trying to mock Network service like below
const serviceMock = sinon.createStubInstance(NetworkService);
await sendAPIRequest({name: 'foobar'})
});
});
Run Code Online (Sandbox Code Playgroud)
但我收到了类似的错误
错误:预期在对象上存根方法,但没有找到
NetworkService.测试时如何模拟我的sendAPIRequest.
我想对下面的函数进行单元测试,该函数在我的 node.js 服务器中使用 axios 调用端点。
const callValidateCookieApi = async (cookie) => {
try {
const config = {
method: 'post',
url: process.env.API_COOKIE_VALIDATION,
headers: {
Cookie: cookie
}
}
return await axios(config)
} catch (error) {
console.log(error.message)
return error
}
}
Run Code Online (Sandbox Code Playgroud)
如何通过模拟函数内部的 axios 调用来编写单元测试用例?
我已经进入了单元测试阶段,说实话,网上所有不同的例子让我感到困惑。我对Mocha & Chai很了解,但Sinon却是另一回事。
所以我有一个我认为非常简单的设置。我有一个调用控制器的 POST 路由。这个控制器就像这样(删除了一些基本的验证代码)
const { createUser } = require('../services/user.service');
const apiResponse = require('../helpers/apiResponse');
const postUser = async (req, res) => {
const user = {
account_id: req.body.id,
status: req.body.status,
created_at: new Date(),
updated_at: new Date(),
};
const result = await createUser(user);
return apiResponse.successResponseWithData(res, 'User added.', result.affectedRows);
} catch (err) {
return apiResponse.errorResponse(res, err);
}
};
module.exports = {
postUser,
};
Run Code Online (Sandbox Code Playgroud)
所以它真正做的就是验证,然后使用 req 创建一个用户对象并将其传递给服务类。该服务类只是将数据传递给数据库类。
const { addUserToDb } = require('../database/user.db');
const createUser = async (user) => {
try …Run Code Online (Sandbox Code Playgroud) 我想确保构造函数在用Sinon实例化时正在调用一个方法,但是,我似乎无法使它正常工作,因为我相信sinon不会监视正确的实例化:
class Test {
constructor() {
this.someFunction();
}
someFunction() {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
...和测试
describe('constructor', () => {
it('should call someFunction()', () => {
const spyFunc = new Spy(new Test(), 'someFunction');
expect(spyFunc.calledOnce).to.be.true;
});
});
Run Code Online (Sandbox Code Playgroud) sinon ×10
mocha.js ×5
node.js ×5
unit-testing ×5
javascript ×3
chai ×2
aws-sdk ×1
enzyme ×1
express ×1
jestjs ×1
mocking ×1
reactjs ×1
sinon-chai ×1
typescript ×1
webpack ×1