我有一个 Express 应用程序,当某些端点被击中时,它使用node-slack-sdk向 Slack 发布帖子。我正在尝试为一条路线编写集成测试,其中包括从该库调用一个方法。
我想阻止 Slack 库中某些方法的所有默认行为,并简单地断言这些方法是使用某些参数调用的。
我试图简化问题。如何chat
对 an 实例的方法(实际上嵌套在 中)进行存根WebClient
,阻止原始功能,并对调用它的参数进行断言?
我已经尝试了很多没有用的东西,所以我正在编辑它并在这里提供一个大大简化的设置:
index.html
:
const express = require('express');
const {WebClient} = require('@slack/client');
const app = express();
const web = new WebClient('token');
app.post('/', (req, res) => {
web.chat.postMessage({
text: 'Hello world!',
token: '123'
})
.then(() => {
res.json({});
})
.catch(err => {
res.sendStatus(500);
});
});
module.exports = app;
index.test.html
'use strict';
const app = require('../index');
const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
const expect = chai.expect;
chai.use(chaiHttp);
const {WebClient} = require('@slack/client');
describe('POST /', function() {
before(function() {
// replace WebClient with a simplified implementation, or replace the whole module.
});
it('should call chat.update with specific arguments', function() {
return chai.request(app).post('/').send({})
.then(function(res) {
expect(res).to.have.status(200);
// assert that web.chat.postMessage was called with {message: 'Hello world!'}, etc
});
});
});
与其他示例不同,有几件事使这变得困难。一,我们无法访问web
测试中的实例,所以我们不能直接存根方法。第二,该方法隐藏在chat
属性中web.chat.postMessage
,这也与我在 sinon、proxyquire 等文档中看到的其他示例不同。