gpt4 book ai didi

unit-testing - Sails.js:无法为单元测试目的 stub 帮助程序

转载 作者:行者123 更新时间:2023-12-03 20:24:39 24 4
gpt4 key购买 nike

节点版本 : v12.18.3
帆版 (帆):1.2.3

执行单元测试时,我无法 stub sails helper。我有一个助手来处理与数据库的所有通信。此外,我有一个 API,它使用这个助手。在我的测试中,我试图使用 sinon 来 stub 助手:
API:

fn: async function (inputs, exits) {
// Stuff done here
// I need to stub this helper
let result = await sails.helpers.arangoQuery.with({
requestId: REQUEST_ID,
query: query,
queryParams: params
});

}
我的测试:
describe('Get Organization', () => {
it('Server Error - Simulates a failure in fetching the data from ArangoDB', (done) => {
sinon.stub(sails.helpers, 'arangoQuery').returns(null, {status: "success"});

supertest(sails.hooks.http.app)
.get('/organization')
//.expect(200)
.end((error, response) => {
return done()
}
})
})

当我运行测试时,出现以下错误:
  error: Error: cannot GET /organization (500)
at Response.toError (/opt/designhubz/organization-service/node_modules/superagent/lib/node/response.js:94:15)
at ResponseBase._setStatusProperties (/opt/designhubz/organization-service/node_modules/superagent/lib/response-base.js:123:16)
at new Response (/opt/designhubz/organization-service/node_modules/superagent/lib/node/response.js:41:8)
at Test.Request._emitResponse (/opt/designhubz/organization-service/node_modules/superagent/lib/node/index.js:752:20)
at /opt/designhubz/organization-service/node_modules/superagent/lib/node/index.js:916:38
at IncomingMessage.<anonymous> (/opt/designhubz/organization-service/node_modules/superagent/lib/node/parsers/json.js:19:7)
at IncomingMessage.emit (events.js:327:22)
at endReadableNT (_stream_readable.js:1220:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
status: 500,
text: '{}',
method: 'GET',
path: '/organization'
}
根本没有关于此问题的文档。谁能告诉我如何 stub helper ?

最佳答案

风帆助手使用 machine ,这使得 stub 制作更加棘手。
AFAIK ,stubsails helpers 的替代方法是通过stubbing 真正的 fn 函数,因为机器会调用助手的 fn 函数。
更新 : 更改使用 supertest 的示例。
例如:

  • 我使用 HelloController 创建端点 GET/hello,
  • 我使用来自 helper's example 的助手格式欢迎信息,
  • 我为端点 GET/hello 创建了测试规范。
  • 我使用 mocha 运行它而不使用 Lifecycle.js,但将生命周期嵌入到测试规范 ( reference ) 中。

  • 端点 GET/hello 定义:
    // File: HelloController.js
    module.exports = {
    hello: async function (req, res) {
    // Dummy usage of helper with predefined input test.
    const output = await sails.helpers.formatWelcomeMessage.with({ name: 'test' });
    // Just send the output.
    res.send(output);
    }
    };
    并且不要忘记添加路由: 'GET /hello': 'HelloController.hello'在 config/routes.js。
    测试规范包含 3 种情况(正常调用、 stub 错误和 stub 成功)。
    // File: hello.test.js
    const sails = require('sails');
    const sinon = require('sinon');
    const { expect } = require('chai');
    const supertest = require('supertest');

    describe('Test', function () {
    let fwm;
    // Copy from example testing lifecycle.
    before(function(done) {
    sails.lift({
    hooks: { grunt: false },
    log: { level: 'warn' },
    }, function(err) {
    if (err) { return done(err); }
    // Require helper format welcome message here!
    fwm = require('../api/helpers/format-welcome-message');
    return done();
    });
    });

    after(function(done) {
    sails.lower(done);
    });

    it('normal case', function (done) {
    // Create spy to make sure that real helper fn get called.
    const spy = sinon.spy(fwm, 'fn');
    supertest(sails.hooks.http.app)
    .get('/hello')
    .expect(200)
    // Expect endpoint output default value.
    .expect('Hello, test!')
    .end(function() {
    // Make sure spy is called.
    expect(spy.calledOnce).to.equal(true);
    // Restore spy.
    spy.restore();
    done();
    });
    });

    it('case stub error', function (done) {
    // Stub the real fn function inside custom helper.
    const stubError = sinon.stub(fwm, 'fn');
    stubError.callsFake(async function (input, exits) {
    // Setup your error here.
    exits.error(new Error('XXX'));
    });

    supertest(sails.hooks.http.app)
    .get('/hello')
    .expect(500)
    .end(function() {
    // Make sure stub get called once.
    expect(stubError.calledOnce).to.equal(true);
    // Restore stub.
    stubError.restore();
    done();
    });
    });

    it('case stub success', function (done) {
    // Define fake result.
    const fakeResult = 'test';
    // Stub the real fn function inside custom helper.
    const stubSuccess = sinon.stub(fwm, 'fn');
    stubSuccess.callsFake(async function (input, exits) {
    // Setup your success result here.
    exits.success(fakeResult);
    });

    supertest(sails.hooks.http.app)
    .get('/hello')
    // Expect endpoint to output fake result.
    .expect(fakeResult)
    .end(function() {
    // Make sure stub get called once.
    expect(stubSuccess.calledOnce).to.equal(true);
    // Restore stub.
    stubSuccess.restore();
    done();
    });
    });
    });
    当我使用 mocha 运行它时:
    $ npx mocha test/hello.test.js 

    Test
    ✓ normal case
    error: Sending 500 ("Server Error") response:
    Error: XXX
    at Object.<anonymous> ...
    ✓ case stub error
    ✓ case stub success

    3 passing (407ms)

    $

    关于unit-testing - Sails.js:无法为单元测试目的 stub 帮助程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63779249/

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