fra*_*ure 6 unit-testing mocha.js sinon sails.js
我是新手测试并试图了解如何测试一个相当简单的控制器动作.我遇到的问题是不知道如何完成模拟控制器内部的方法,甚至不知道何时适合这样做.
该操作在我的webapp的db中创建一个挂起的用户并返回一个join链接.它看起来像这样:
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});
});
}
}
Run Code Online (Sandbox Code Playgroud)
我为这个方法编写的测试如下所示:
'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;
}
Run Code Online (Sandbox Code Playgroud)
由于我遇到的障碍,我的测试仍然不完整.从测试中可以看出,我试图模拟请求对象以及控制器操作中调用的第一个方法req.allParams().但是,这潜在地称为控制器中的第二个方法是res.badRequest(),这是一种内置于功能ressails.js内对象.
这个功能我不知道如何模拟.此外,考虑嘲笑这个功能会引发各种其他问题.为什么我首先要嘲笑这个功能?我认为,单元测试的逻辑是,你可以与其他人隔离测试代码的一部分,但这不是有点远吗?它还会产生大量额外的工作,因为我需要模拟这个函数的行为,这可能是也可能不容易实现.
我在这里编写的代码基于一些概念验证类型的教程(请参见此处,此处和此处),但这些帖子不涉及您在req和/或上有方法的问题res控制器中的对象.
在这里寻求解决方案的正确方法是什么?任何见解将不胜感激!
您正在尝试在待处理的用户控制器上测试创建操作并断言其响应/行为。您实际上可以做的是向Supertest发出请求来测试它。
我假设您已经使用 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.");
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
有关控制器测试Sails.js 的更多信息,请参阅文档或查看此示例项目以了解更多信息。
| 归档时间: |
|
| 查看次数: |
1796 次 |
| 最近记录: |