gpt4 book ai didi

node.js - 我将如何测试在 express 中使用 mocha/chai/superagent 发送路由?

转载 作者:行者123 更新时间:2023-11-28 20:22:45 24 4
gpt4 key购买 nike

    it('sends login page if we\'re logged out at /', function (done) {
superagent.get('http://localhost:4000/').end(function(err, res){
if(err) {return done(err)}
expect(res).to.have.property('status', 200);


//how would i do something like this?
expect(res.viewRendered).to.be.equal('index.ejs')
done();
});
});

我是测试新手,我非常讨厌它。我正在尝试学习基础知识,这是我经历过的最令人沮丧的学习曲线。我已经查找了几个小时的文档,但仍然无法弄清楚如何检查已呈现的路线

最佳答案

我会用另一种方式来解决这个问题:而不是依赖于请求的输出,而是将其与模板进行匹配(这可能非常困难,除非您向每个模板添加某种标识符,这并不感觉完全正确),您可以利用 Express 的一些内部结构,特别是它如何呈现模板。

Express 文档说明如下 ( here ):

Express-compliant template engines such as Pug export a function named __express(filePath, options, callback), which is called by the res.render() function to render the template code.

你使用的不是 Pug,而是 EJS,但同样的原则适用:ejs 模块导出一个名为 __express 的函数,它将使用模板的完整路径调用应该呈现。这也恰好是您要测试的内容!

所以现在的问题是:“您如何测试 ejs.__express() 是否使用正确的模板名称调用?”。答:您可以监视它。

我最喜欢的模块是 Sinon ,因此下面的示例将使用它。 Sinon 非常适合监视现有功能,或者根据需要让它们做完全不同的事情。

作为示例,我将使用以下非常简单的 Express 应用程序:

// app.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
res.render('index.ejs', { foo : 'bar' });
});

module.exports = app;

我们想测试当 / 被请求时,模板 index.ejs 是否被渲染。

我将使用 supertest 而不是使用 superagent ,用于测试 HTTP 应用程序。

这是带注释的 Mocha 测试文件:

// Import the Express app (from the file above), which we'll be testing.
const app = require('./app');

// Import some other requirements.
const expect = require('chai').expect;
const supertest = require('supertest');
const sinon = require('sinon');

// Import the EJS library, because we need it to spy on.
const ejs = require('ejs');

// Here's the actual test:
it('sends login page if we\'re logged out at /', function (done) {
// We want to spy on calls made to `ejs.__express`. We use Sinon to
// wrap that function with some magic, so we can check later on if
// it got called, and if so, if it got called with the correct
// template name.
var spy = sinon.spy(ejs, '__express');

// Use supertest to retrieve / and make sure that it returns a 200 status
// (so we don't have to check for that ourselves)
supertest(app)
.get('/')
.expect(200)
.end((err, res) => {
// Pass any errors to Mocha.
if (err) return done(err);

// Magic! See text below.
expect(spy.calledWithMatch(/\/index\.ejs$/)).to.be.true;

// Let Sinon restore the original `ejs.__express()` to its original state.
spy.restore();

// Tell Mocha that our test case is done.
done();
});
});

那么这是什么魔法:

spy.calledWithMatch(/\/index\.ejs$/)

这意味着:“如果被监视的函数 (ejs.__express()) 的第一个参数与正则表达式 \/index\.ejs$"。这就是您要测试的内容。

我在这里使用正则表达式的原因是因为我很懒。因为第一个参数(上面引用中的 filePath)将包含模板文件的完整 路径,所以它可能会很长。如果你愿意,你可以直接测试它:

spy.calledWith(__dirname + '/views/index.ejs')

但是如果模板目录的位置发生变化,那将会中断。所以,就像我说的,我很懒,我会改用正则表达式匹配。

使用 supertestsinonchai 等工具,测试实际上可以变得有趣(老实说!)。我不得不承认学习曲线相当陡峭,但也许像这样的带注释的示例可以帮助您更好地了解什么是可能的以及如何去做。

关于node.js - 我将如何测试在 express 中使用 mocha/chai/superagent 发送路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37170542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com