关于Nodejs中nodeunit使用的问题,请各路神仙指点

关于Nodejs中nodeunit使用的问题,请各路神仙指点

需求是这样,我在测试一个方法。用来修改用户的密码,但是修改密码需要在登陆状态下进行。每次post都会被前一步拦截 app.post(’/ChangePassword’, star.checkLogin); app.post(’/ChangePassword’, star.ChangePassword); 但我不知道怎么在测试这个方法的时候先执行登陆操作 exports.ChangePwd_fail_wrongName = function(test) { test.expect(2); request.post( { url: h + “/ChangePassword”, json: { name: “liminhao1”, oldPassword: “liminhao521”, newPassword: “liminhao521”}}, function (err, resp, body) { test.equal(resp.statusCode, 400); test.equal(resp.body.err, “user does not exist”); test.done(); } ); }; 不知道我描述清楚没有?


2 回复

当然可以。根据你的需求,你需要在测试修改用户密码的方法之前,先完成登录操作。这可以通过在测试函数中首先发起一个登录请求来实现。nodeunit 是一个 Node.js 的单元测试框架,你可以利用它来进行这样的集成测试。

以下是一个示例代码,展示了如何在测试修改密码之前先执行登录操作:

var request = require('request');
var nodeunit = require('nodeunit');

// 假设这是你的 app 实例
var app = require('./app'); // 你的 Express 应用

// 登录方法
exports.login = function(username, password, callback) {
    request.post(
        { url: 'http://localhost:3000/login',
          json: { name: username,
                  password: password }},
        function (err, resp, body) {
            if (err) return callback(err);
            callback(null, resp.body.token); // 假设服务器返回的 token 用于后续请求
        }
    );
};

// 修改密码失败的测试用例(用户名错误)
exports.ChangePwd_fail_wrongName = function(test) {
    test.expect(2);

    // 先登录
    exports.login('liminhao', 'correctpassword', function(err, token) {
        if (err) throw err;

        // 使用 token 进行修改密码请求
        request.post(
            { url: 'http://localhost:3000/ChangePassword',
              headers: {
                  'Authorization': 'Bearer ' + token // 假设使用 Bearer Token 验证
              },
              json: { name: 'wrongusername',
                      oldPassword: 'liminhao521',
                      newPassword: 'liminhao521'}},
            function (err, resp, body) {
                test.equal(resp.statusCode, 400);
                test.equal(body.err, "user does not exist");
                test.done();
            }
        );
    });
};

解释

  1. 登录方法:我们定义了一个 login 方法,它接受用户名和密码作为参数,并通过 POST 请求发送到 /login 端点。如果登录成功,服务器将返回一个 token,该 token 用于后续请求的身份验证。
  2. 修改密码测试用例:在 ChangePwd_fail_wrongName 测试用例中,我们首先调用 login 方法进行登录。一旦登录成功并获得 token,我们将其添加到请求头中,并向 /ChangePassword 发送 POST 请求。如果用户名错误,服务器应该返回状态码 400 和相应的错误信息。

这种方法确保了在测试修改密码功能之前,用户已经处于登录状态。


在测试时需要先完成登录操作,然后再去调用修改密码的方法。这里可以利用 nodeunit 的异步测试能力,确保先完成登录操作后再进行密码修改的测试。

以下是一个简单的示例,展示了如何先完成登录操作再测试修改密码的功能:

var request = require('request');
var assert = require('assert');

exports.testChangePassword = function(test) {
    // Step 1: Login
    request.post({
        url: 'http://localhost/login',
        json: { username: 'liminhao1', password: 'liminhao521' }
    }, function(err, loginResp, loginBody) {
        assert.ifError(err);

        // Step 2: Get the session token from login response
        var sessionToken = loginBody.sessionToken;

        // Step 3: Change Password using the session token
        request.post({
            url: 'http://localhost/ChangePassword',
            headers: {
                'Cookie': 'session=' + sessionToken
            },
            json: { name: 'liminhao1', oldPassword: 'liminhao521', newPassword: 'newpassword' }
        }, function(err, changeResp, changeBody) {
            assert.ifError(err);

            // Assertions for the change password response
            test.equal(changeResp.statusCode, 200);
            test.equal(changeBody.status, 'success');
            test.done();
        });
    });
};

exports.testChangePassword_fail_wrongName = function(test) {
    test.expect(2);
    
    request.post({
        url: 'http://localhost/ChangePassword',
        json: { name: 'wrongusername', oldPassword: 'liminhao521', newPassword: 'newpassword' }
    }, function(err, resp, body) {
        test.equal(resp.statusCode, 400);
        test.equal(body.err, 'user does not exist');
        test.done();
    });
};

解释

  1. 登录操作:首先发送一个POST请求到登录接口,并获取返回的会话令牌(sessionToken)。
  2. 修改密码:将获取到的会话令牌添加到请求头中,再次发送POST请求到修改密码接口。
  3. 断言检查:通过 nodeunittest.equal 方法对响应状态码和返回体进行验证。

确保在实际代码中替换 http://localhost/loginhttp://localhost/ChangePassword 为实际的服务器地址。这样就可以在测试修改密码功能时先完成登录操作。

回到顶部