Debugging 使用内存数据源进行验收测试不';行不通

Debugging 使用内存数据源进行验收测试不';行不通,debugging,testing,datasource,loopback,acceptance-testing,Debugging,Testing,Datasource,Loopback,Acceptance Testing,我使用内存数据源创建了控制器的验收测试。 在测试开始之前,我尝试使用干净的数据库,只通过调用端点向登录添加1个用户凭据,因为测试的其余部分需要使用访问令牌进行身份验证访问 从giveuser创建用户记录后,我可以在getUser中获取用户信息。 但是,登录请求找不到凭据。助手和客户端似乎不共享同一个内存数据源 我不确定在这种情况下什么配置设置是错误的 src/tests/fixture/datasources/testdb.datasource.ts 从'@loopback/repository

我使用内存数据源创建了控制器的验收测试。 在测试开始之前,我尝试使用干净的数据库,只通过调用端点向登录添加1个用户凭据,因为测试的其余部分需要使用访问令牌进行身份验证访问

giveuser
创建用户记录后,我可以在
getUser
中获取用户信息。 但是,登录请求找不到凭据。助手和客户端似乎不共享同一个内存数据源

我不确定在这种情况下什么配置设置是错误的

src/tests/fixture/datasources/testdb.datasource.ts

从'@loopback/repository'导入{juggler};
export const testdb:juggler.DataSource=new juggler.DataSource({
名称:“db”,
连接器:“内存”,
});
src/datasources/mongodb.datasource.ts

从'@loopback/core'导入{inject};
从'@loopback/repository'导入{juggler};
从“/mongodb.datasource.json”导入*作为配置;
导出类MongodbDataSource扩展了juggler.DataSource{
静态数据源名称='mongodb';
建造师(
@inject('datasources.config.mongodb',{optional:true})
dsConfig:object=config,
) {
超级(dsConfig);
}
}
user.controller.acceptance.ts

从'@loopback/testlab'导入{Client,expect,supertest};
从“....”导入{ApiApplication};
从“./test helper”导入{setupApplication};
从“../helpers/database.helpers”导入{givenEmptyDatabase,givenUser,getUser};
描述('UserController',()=>{
let-app:api应用程序;
让客户:supertest.supertest;;
让jwtToken:string;
在('setupApplication',async()=>{
({app,client}=wait setupApplication());
});
之前(给定nemptydatabase);
前(后);
之前(getUser);
之前(异步()=>{
const response=等待客户端
.post(“/login”)
.send({用户名:'user1',密码:'password'});
jwtToken=response.body.token;
});
之后(异步()=>{
等待app.stop();
});
它('在没有身份验证的情况下调用GET/info',async()=>{
常数预期错误={
错误:{
状态代码:401,
名称:'未经授权的罪犯',
信息:“未经授权”
}
};
const res=wait client.get('/user/info').expect(401);
expect(res.body).to.containEql(expectedError);
});
测试帮助。ts

从“....”导入{ApiApplication};
进口{
createRestAppClient,
给定HttpServerConfig,
客户
}来自“@loopback/testlab”;
从“../fixtures/datasources/testdb.datasource”导入{testdb};
导出异步函数setupApplication():Promise{
const-app=新的ApiApplication();
等待app.bind('datasources.config.mongodb').to({
名称:“mongodb”,
连接器:“内存”,
是的,
});
等待app.boot();
等待app.start();
const client=createRestAppClient(应用程序);
返回{app,client};
}
导出接口AppWithClient{
应用程序:应用程序;
客户:客户;
}
数据库.helper.ts

从“../../repositories”导入{UserRepository};
从“../../models”导入{User};
从“../fixtures/datasources/testdb.datasource”导入{testdb};
导出异步函数givenEmptyDatabase(){
让userRepo:UserRepository;
userRepo=新的UserRepository(testdb);
userRepo.deleteAll();
}
导出异步函数givenUser(){
让userRepo=newuserrepository(testdb);
常量用户={
用户名:“user1”,
密码:“password”,
创建日期:新日期('2019-08-08'),
更新日期:新日期('2019-08-08'),
}
等待userRepo.create(操作员);
}
导出异步函数getUser(){
让userRepo=newuserrepository(testdb);
const users=wait userRepo.find();
console.log(用户);
}
助手和客户端似乎不共享同一个内存数据源

没错

认识到使用同一连接器可以有多个数据源是很重要的,例如,您可以使用一个MongoDB服务器创建一个
logDb
,并将
userDb
连接到另一个服务器。这同样适用于
memory
数据源,您可以使用
memory
连接器和每个连接器创建多个数据源实例将有自己的数据空间

由于您已经在测试中更改了主
mongodb
数据源的配置,因此我建议在设置初始测试数据时使用修改后的数据源

数据库.helper.ts
中:

export async function givenEmptyDatabase(db) {
  let userRepo: UserRepository;

  userRepo = new UserRepository(db);

  userRepo.deleteAll();
}

export async function givenUser(db) {
  // ...
}
// and so on
在您的测试中:

before(async () => {
 const db = await app.get<juggler.DataSource>('datasources.config.mongodb');
 await givenEmptyDatabase(db);
});
before(异步()=>{
const db=await app.get('datasources.config.mongodb');
等待给定的nemptydatabase(db);
});
我个人强烈建议在测试中使用与生产中相同的数据库。
内存
数据库的行为与MongoDB不同。在
内存
中存储数据时,某些操作可能会通过,但在使用MongoDB时会失败。

您可以在LoopBack的“最佳实践”指南中了解有关测试的更多信息: