【问题标题】:Run Jasmine tests after initial function calls在初始函数调用后运行 Jasmine 测试
【发布时间】:2023-03-13 20:25:02
【问题描述】:

我正在为 Node.js API 编写 Jasmine 测试。我正在尝试测试创建用户功能。测试如下所示:

describe('User test', function() {
  describe('Post /api/saveUser'), function() {
    it('saves a new user', function(done) {
      request.post({url: 'http://website/api/saveUser', form:{email:testU.email, password:testU.password}, headers: {'authorization': adminU.jwt}}, function(err, res, body) {
        expect(res.statusCode).toBe(200);
      });
    });
  });
});

所以我需要对规范中的管理员用户 (adminU) 进行身份验证,以获取有效令牌以传递请求。这是使用另一个端点完成的。

request.post({url: 'http://website/api/authenticate', form:{email:adminU.email, password: adminU.password}}, function(err, res, body) {
  adminUser.jwt = JSON.parse(res.body).token;
});

但是我如何将这些结合起来。如果我在 User 测试块上方插入身份验证代码,则在收到来自身份验证端点的响应之前运行用户测试。显而易见的选择是将用户测试包装在来自身份验证 api 的回调中,但是当我运行测试时,Jasmine 实际上并没有运行它们。

在 Jasmine 规范中使用回调结果的最佳方式是什么?

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/27344872/…
  • 谢谢,这确实有帮助。将身份验证放在带有done() 的“it”函数中意味着身份验证首先发生,这很好。是否可以将其从“it”规范中移出,以便所有其他测试都可以访问数据以节省为每个规范进行身份验证调用?或者这是不好的做法/不可能?
  • 我不太确定,我最近才开始使用 Jasmine。我所做的只是一个快速的谷歌。这里还有另外几个有趣的链接:htmlgoodies.com/beyond/javascript/stips/…htmlgoodies.com/beyond/javascript/… 基本上搜索了 jasmine 异步测试
  • 谢谢,我去看看

标签: javascript node.js testing jasmine


【解决方案1】:

您需要等到 auth 调用的请求完成。

it('saves a new user', function(done) {
    request.post({
        url: 'http://website/api/authenticate',
        form: {
            email: adminU.email,
            password: adminU.password
        }
    }, function(err, res, body) {
        adminUser.jwt = JSON.parse(res.body).token;
        request.post({
            url: 'http://website/api/saveUser',
            form: {
                email: testU.email,
                password: testU.password
            },
            headers: {
                'authorization': adminU.jwt
            }
        }, function(err, res, body) {
            expect(res.statusCode).toBe(200);
            done();
        });
    });
});

如果您在不止一项测试中需要令牌,我建议将其放在 before 块中。如果你这样做,jasmine 在开始测试之前运行一次,你不必在每个测试用例中都进行 auth 调用。

before(function(done){
    request.post({
        url: 'http://website/api/authenticate',
        form: {
            email: adminU.email,
            password: adminU.password
        }
    }, function(err, res, body) {
        if(err) done(err);
        adminUser.jwt = JSON.parse(res.body).token;
        done();
    });
});

另外,我推荐使用 supertest 来测试 api。见https://www.npmjs.com/package/supertest

【讨论】:

  • 谢谢。不幸的是,我正在使用没有 before 功能的 Jasmine-node,但这是切换到最新标准 Jasmine 版本的令人信服的理由。
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2012-06-26
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多