gpt4 book ai didi

unit-testing - 如何使用 Mocha + Sinon 在 Sails.js 中的 Controller 中测试方法?

转载 作者:行者123 更新时间:2023-12-04 15:33:26 26 4
gpt4 key购买 nike

我是测试新手,并试图了解如何测试一个相当简单的 Controller 操作。我遇到的问题是不知道如何完成对 Controller 内部方法的模拟,甚至不知道何时适合这样做。

该操作在我的 web 应用程序的数据库中创建一个待处理的用户并返回一个加入链接。它看起来像这样:

module.exports = {

create: function(req, res, next) {

var name,
invitee = req.allParams();

if ( _.isEmpty(invitee) || invitee.name === undefined) {
return res.badRequest('Invalid parameters provided when trying to create a new pending user.');
}

// Parse the name into its parts.
name = invitee.name.split(' ');
delete invitee.name;
invitee.firstName = name[0];
invitee.lastName = name[1];

// Create the pending user and send response.
PendingUser.create(invitee, function(err, pending) {
var link;

if (err && err.code === 'E_VALIDATION') {
req.session.flash = { 'err': err };
return res.status(400).send({'err':err});
}

// Generate token & link
link = 'http://' + req.headers.host + '/join/' + pending.id;

// Respond with link.
res.json({'joinLink': link});
});

}

}

我为此方法编写的测试如下所示:
'use strict';
/**
* Tests for PendingUserController
*/

var PendingUserController = require('../../api/controllers/PendingUserController.js'),
sinon = require('sinon'),
assert = require('assert');

describe('Pending User Tests', function(done) {

describe('Call the create action with empty user data', function() {
it('should return 400', function(done) {

// Mock the req object.
var xhr = sinon.useFakeXMLHttpRequest();
xhr.allParams = function() {
return this.params;
};
xhr.badRequest
xhr.params = generatePendingUser(false, false, false, false);

var cb = sinon.spy();

PendingUserController.create(xhr, {
'cb': cb
});
assert.ok(cb.called);
});
});
}

function generatePendingUser(hasName, hasEmail, hasAffiliation, hasTitle) {
var pendingUser = {};

if (hasName) pendingUser.name = 'Bobbie Brown';
if (hasEmail) pendingUser.emailAddress = 'bobbie.brown@example.edu';
if (hasAffiliation) pendingUser.affiliation = 'Very Exclusive University';
if (hasTitle) pendingUser.title = "Assistant Professor";

return pendingUser;
}

由于我遇到了障碍,我的测试仍未完成。从测试中可以看出,我试图模拟请求对象以及在 Controller 操作 req.allParams() 中调用的第一个方法。 .但是 Controller 中可能调用的第二种方法是 res.badRequest() ,这是一个 function built into the res object within sails.js .

这个功能我不知道怎么模拟。此外,考虑模拟这个函数会引发各种其他问题。为什么我首先要模拟这个函数?我认为,单元测试的逻辑是,您将代码的一部分与其他部分隔离开来,但这不是有点远吗?它还产生了大量额外的工作,因为我需要模拟这个函数的行为,这可能会也可能不会很容易完成。

我在这里编写的代码基于一些概念验证类型的教程(参见 hereherehere ),但这些帖子不涉及您拥有方法的问题在 Controller 中的 req 和/或 res 对象上。

在这里解决解决方案的正确方法是什么?任何见解将不胜感激!

最佳答案

您正在尝试在挂起的用户 Controller 上测试创建操作并断言它的响应/行为。您实际上可以做的是向 Supertest 发出请求测试它。

我假设您已经 bootstrapped your test使用 Mocha 和 should.js。

 var request = require('supertest');

describe('PendingUsersController', function() {

describe('#create()', function() {
it('should create a pending user', function (done) {
request(sails.hooks.http.app)
.post('/pendinguser')
//User Data
.send({ name: 'test', emailAdress: 'test@test.mail', affiliation: 'University of JavaScript', title: 'Software Engineer' })
.expect(200)
.end(function (err, res) {
//true if response contains { message : "Your are pending user."}
res.body.message.should.be.eql("Your are pending user.");
});
});
});
});

更多关于 Controller 测试 Sails.js from docs或查看 this example项目更多。

关于unit-testing - 如何使用 Mocha + Sinon 在 Sails.js 中的 Controller 中测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29731336/

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