angular - 与 Typescript 的集成测试不会调用回调订阅
问题描述
我正在编写一个集成测试来检查后端的 API。
服务是:
export class Service {
check(details: Credential, successBlock, errorBlock){
let localString = "changeAuthenticationCredentialAPI/v2/authenticationCredential/check";
let url = BASE_URL_SERVER + localString;
let body = { details };
let success = (data) => {
let _authorization = data.headers["Authorization"];
let _clientID = data.body.relatedParty[0].id[0].value;
let _token : Token = {};
_token.token = _authorization;
_token.clientId = _clientID;
successBlock(_token);
}
this.post(success,errorBlock,url,body);
}
handleErrorSync(error) {
try {
return Observable.throw(JSON.parse(error._body));
} catch (e) {
return Observable.throw(error._body);
}
}
post(success, error, url, body) {
const options = {
headers: new HttpHeaders(HEADER_REQUEST)
};
let call = this.http.post(url, body,options).catch(this.handleErrorSync);
this.makeCall(call, success, error);
}
makeCall(call, success, error) {
call.flatMap(
(result) => {
if (this.responseIsOk(result)) {
return Observable.of(result);
} else {
error(result);
return Observable.throw(result);
}
}
).subscribe(
(result) => {
success(result); },
(err) => {
this.popupError(err);
error(err);
}
);
}
}
集成测试看起来像
describe("authentication-credential-service.spec", () => {
let backend : Service
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
HttpClientTestingModule
],
providers: [
Service,
{ provide: ToastController, useClass: class { ToastController = jasmine.createSpy("ToastController"); } },
{ provide: ModalController, useClass: class { ModalController = jasmine.createSpy("ModalController"); } },
FileTransfer,
File
]
});
backend = TestBed.get(Service);
}));
it("should be created", inject([Service], (service: Service) => {
expect(service).toBeTruthy();
}));
describe("check", () => {
it( "should answer 200 with the right token", async(inject([Service], (service:Service) => {
let credential: Credential = {};
credential.credentialType = "password";
credential.usernameText = "user";
credential.passwordText = "therightpassword";
let _result : Token
let successBlock = ( (data) => {
_result = data
expect(data).toBeDefined();
} );
let errorBlock = (error) => {
expect(false).toBeTruthy();
};
service.check(
credential,
successBlock,
errorBlock
);
})));
});
})
问题是运行测试时订阅“makeCall”方法永远不会被调用。所以基本上测试通过了,但只是因为没有运行测试。
使用它的主要目的是检查与我后端的其余 api 的一致性,但在那里我发现只使用模拟后端或模拟 http 响应进行测试:非常适合单元测试,但不适用于集成测试。
还有一件事:当然调试它工作的代码并调用订阅。
有什么线索吗?谢谢
解决方案
最后,我发现问题与我在 testBed 配置的导入中使用 HttpClientModule 和 HttpClientTestingModule 的事实有关,并且不知何故破坏了集成测试。删除 HttpClientTestingModule 成功了
describe("authentication-credential-service.spec", () => {
let backend : Service
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule
],
providers: [
Service,
{ provide: ToastController, useClass: class { ToastController = jasmine.createSpy("ToastController"); } },
{ provide: ModalController, useClass: class { ModalController = jasmine.createSpy("ModalController"); } },
FileTransfer,
File
]
});
backend = TestBed.get(Service);
}));
it("should be created", inject([Service], (service: Service) => {
expect(service).toBeTruthy();
}));
describe("check", () => {
it( "should answer 200 with the right token", async(inject([Service], (service:Service) => {
let credential: Credential = {};
credential.credentialType = "password";
credential.usernameText = "user";
credential.passwordText = "therightpassword";
let _result : Token
let successBlock = ( (data) => {
_result = data
expect(data).toBeDefined();
} );
let errorBlock = (error) => {
expect(false).toBeTruthy();
};
service.check(
credential,
successBlock,
errorBlock
);
})));
});
})
推荐阅读
- c++ - 如何在 C++ 中使用 ncurses 打印 Unicode 字符?
- powerbi - 显示所有值的切片器 - Power BI Desktop
- c# - 我们如何在 C# 中为 Azure Data Lake 在 azure fileclient 中设置 setMetadata
- python-3.x - 如果找到特定字符串,则设置为变量
- algorithm - 是否重新排列 Floyd-Warshall 算法中的外循环,因为大多数内循环会改变算法
- amazon-web-services - AWS 未能为放大应用程序创建后端
- r - 在 RSelenium 中截取屏幕截图
- reactjs - 反应改变状态下一个组件
- agora.io - Agora.io 用户无法显示其他用户,但可以发送自己的图像并显示
- api - 邮递员多次运行相同的请求