Node.js 环回测试:使用用户和角色进行测试的正确方法是什么

Node.js 环回测试:使用用户和角色进行测试的正确方法是什么,node.js,testing,loopbackjs,Node.js,Testing,Loopbackjs,我正在尝试使用环回测试编写测试 我有点困惑,几乎没有任何文档 我想测试一个只有角色为“admin”的用户才具有写入权限的模型 现在,如果我这样做: lt.describe.whenCalledByUserWithRole(test_config.adminUserCredentials, test_config.adminRole, ....) loopback实际上会在登录之前创建一个具有test\u config.adminUserCredentials的用户! 它为什么这样做 正确的行为

我正在尝试使用环回测试编写测试

我有点困惑,几乎没有任何文档

我想测试一个只有角色为“admin”的用户才具有写入权限的模型

现在,如果我这样做:

lt.describe.whenCalledByUserWithRole(test_config.adminUserCredentials, test_config.adminRole, ....)
loopback
实际上会在登录之前创建一个具有
test\u config.adminUserCredentials
的用户! 它为什么这样做

正确的行为,IMHO,应该是:

  • 在测试设置中创建用户
  • 在测试设置中创建角色
  • 将角色与用户关联
  • 运行测试时,仅检查用户是否拥有请求操作的权限
但是环回测试看起来相当棘手。如果我在安装程序中创建一个用户,测试将崩溃,因为
当CalledByUserWithRole
将在该过程中再次尝试创建该用户,而该环回将否认该用户已经存在。如果我没有创建一个用户并在CalledByUserWithRole时调用
,那么由于某种原因,该用户将不会与“admin”角色关联(即使名称表明是这样),并且测试失败


如何正确执行此操作?

我最终编写了自己的环回测试扩展:

var app         = require('../server/server.js');
var _beforeEach = require('loopback-testing').beforeEach;
var _describe = require('loopback-testing').describe;

var helpers = exports = module.exports = { 
  describe: _describe,
  it: _it,
  beforeEach: _beforeEach
};

_beforeEach.givenExistingUserWithRole = function(credentials, role, optionalHandler) {
  console.log("_beforeEach.givenExistingUserWithRole");

  before(function(cb) {
    var test = this;
    username = credentials.username;
    pwd      = credentials.password;

    loginCredentials = {username:username,password:pwd};
    app.models.User.login(loginCredentials, function(err, token) {
      if(err) {
        console.log("Error logging in test user! " + err);
      } else {
        console.log("Test user successfully logged in.");
        test.loggedInAccessToken = token;
        console.log(token);
      }   
       cb();
    }); 
  }); 

  afterEach(function(done) {
  var test = this;
  console.log(this.loggedInAccessToken);
  this.loggedInAccessToken.destroy(function(err) {
    if(err) return done(err);
    test.loggedInAccessToken = undefined;
    done();
    }); 
  }); 
}