问题描述
我有以下其余端点代码“/files/lookup”。这将接收一个查询参数 folderPath,并将返回一个包含详细信息(包括元数据)但不包含内容的文件列表。 我包括了其余端点的内容。这会连接到 azure blob 存储。
@get('/files/lookup',{ ... })
...
const blobServiceClient: BlobServiceClient = BlobServiceClient.fromConnectionString(
this.azureStorageConnectionString,);
const containerClient: ContainerClient = blobServiceClient.getContainerClient(container);
const filesPropertiesList: FileProps[] = [];
try {
for await (const item of containerClient.listBlobsByHierarchy('/',{
prefix: decodedAzureFolderPath,includeMetadata: true,})) {
if (item.kind !== 'prefix') {
const blobitem: BlobItem = item;
const blobProperties: BlobProperties = blobitem.properties;
const blobMetadata: Record<string,string> | undefined = blobitem.Metadata;
const aFileProperties: FileProps = {
name: item?.name,uploadedDate:
blobProperties.lastModified?.toISOString() ?? blobProperties.createdOn?.toISOString(),size: blobProperties.contentLength,contentType: blobProperties.contentType,Metadata: blobMetadata,};
filesPropertiesList.push(aFileProperties);
}
}
} catch (error) {
if (error.statusCode === 404) {
throw new HttpErrors.NotFound('Retrieval of list of files has Failed');
}
throw error;
}
return filesPropertiesList;
我正在做 sinon 测试。我是sinon的新手。我无法有效地使用模拟/存根/等。测试返回具有属性的文件列表的端点。无法模拟/存根容器客户端的 listBlobsByHierarchy 方法
describe('GET /files/lookup',() => {
let blobServiceClientStub: sinon.SinonStubbedInstance<BlobServiceClient>;
let fromConnectionStringStub: sinon.SinonStub<[string,StoragePipelineOptions?],BlobServiceClient>;
let containerStub: sinon.SinonStubbedInstance<ContainerClient>;
beforeEach(async () => {
blobServiceClientStub = sinon.createStubInstance(BlobServiceClient);
fromConnectionStringStub = sinon
.stub(BlobServiceClient,'fromConnectionString')
.returns((blobServiceClientStub as unkNown) as BlobServiceClient);
containerStub = sinon.createStubInstance(ContainerClient);
blobServiceClientStub.getContainerClient.returns((containerStub as unkNown) as ContainerClient);
});
afterEach(async () => {
fromConnectionStringStub.restore();
});
it('lookup for files from storage',async () => {
/* let items: PagedAsyncIterableIterator<({ kind: "prefix"; } & BlobPrefix) | ({ kind: "blob"; } & BlobItem),ContainerListBlobHierarchySegmentResponse>;
sinon.stub(containerStub,"listBlobsByHierarchy").withArgs('/',{ prefix: "myf/entity/172/",includeMetadata: true }).returns(items);
const response = await client.get(`/files/lookup?folderpath=myf%2Fentity%2F172%2F`).expect(200); */
});
});
解决方法
由于我没有找到任何方法来模拟具有相同类型的此方法的返回,因此我选择了类型“any”。由于我是这方面的新手,让我的头脑做到这一点真的很有挑战性!
it('lookup for files from storage',async () => {
/* eslint-disable @typescript-eslint/naming-convention */
const obj: any = [
{
kind: 'blob',name: 'myf/entity/172/0670fdf8-db47-11eb-8d19-0242ac13000.docx',properties: {
createdOn: new Date('2020-01-03T16:27:32Z'),lastModified: new Date('2020-01-03T16:27:32Z'),contentLength: 11980,contentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',},metadata: {
object_name: 'Testing.docx',category: 'entity',reference: '172',object_id: '0670fdf8-db47-11eb-8d19-0242ac13000',];
containerStub.listBlobsByHierarchy.returns(obj);
const actualResponse = await (await client.get('/files/lookup?folderpath=myf/entity/172')).body;
const expectedResponse: any[] = [ WHATEVER ]
expect(actualResponse).deepEqual(expectedResponse);
});