Angular 使用 Jasmine 和 Karma 进行测试
Angular testing using Jasmine and Karma
我正在尝试提高 Angular 应用程序的代码覆盖率。在代码覆盖率中提到,if else 条件未被覆盖。谁能告诉我该怎么做?
欢迎询问更多代码细节。
public searchByText(textVal: any): void {
let matchedEquipments = [];
// **
if (this.model.searchText.length > 1) {
matchedEquipments = this.refineByText(textVal, this.equipments);
} else {
matchedEquipments = this.equipments;
}
// **
matchedEquipments = this.refineByPlant(this.model.plants, matchedEquipments);
matchedEquipments = this.refineByPlantIsland(this.model.plantIslands, matchedEquipments);
matchedEquipments = this.refineByProcess(this.model.processes, matchedEquipments);
matchedEquipments = this.refineByIndustry(this.model.divisions, matchedEquipments);
this.displayClientData(matchedEquipments);
this.updateSearchCounters(SelectionFilter.FreeText);
}
规格:
it('verify the result with search', async(() => {
equipmentSelectionComponent.searchByText("123");
//equipmentSelectionComponent.model.searchText = "123";
expect(equipmentSelectionComponent.matchedData.length).toBeGreaterThan(0);
}));
以下测试用例应该能够包含您的测试用例
if condition : 当searchText有值时,应该通过修改设备分配给matchedEquipments
期望:
refineByText toHaveBeenCalledWith(textVal, this.equipments)
else 条件:当 searchText 没有值时,应将设备分配给 matchedEquipments
期望:
refineByText not.toHaveBeenCalledWith(textVal, this.equipments)
您需要编写不止 1 个 it
块来测试它:
it('should call "refineByText" when search Text is there', async(() => {
spyOn(equipmentSelectionComponent,'refineByText').and.callThrough();
equipmentSelectionComponent.model.searchText = "some Val";
equipmentSelectionComponent.equipments = ["item1"]
equipmentSelectionComponent.searchByText("123");
expect(equipmentSelectionComponent.refineByText).toHaveBeenCalledWith("123",["item1"]); // <-- this will check true condition
// I dont see "matchedData" in your provided code so I dont know about this check.
expect(equipmentSelectionComponent.matchedData.length).toBeGreaterThan(0);
// spy and check other function calls as well just like I did for refineByText
}));
it('should not call "refineByText" when search Text is empty', async(() => {
spyOn(equipmentSelectionComponent,'refineByText').and.callThrough();
equipmentSelectionComponent.model.searchText = "";
equipmentSelectionComponent.searchByText("123");
expect(equipmentSelectionComponent.refineByText).not.toHaveBeenCalled(); // <-- this will check true condition
// similarly use use "toHaveBeenCalledWith(val) for other functions
}));
我建议您阅读 angular 的 testing with spies and also some more basic testing ways。这将帮助您更加熟悉单元测试的思维方式。也请随意鼓掌! :)
我正在尝试提高 Angular 应用程序的代码覆盖率。在代码覆盖率中提到,if else 条件未被覆盖。谁能告诉我该怎么做? 欢迎询问更多代码细节。
public searchByText(textVal: any): void {
let matchedEquipments = [];
// **
if (this.model.searchText.length > 1) {
matchedEquipments = this.refineByText(textVal, this.equipments);
} else {
matchedEquipments = this.equipments;
}
// **
matchedEquipments = this.refineByPlant(this.model.plants, matchedEquipments);
matchedEquipments = this.refineByPlantIsland(this.model.plantIslands, matchedEquipments);
matchedEquipments = this.refineByProcess(this.model.processes, matchedEquipments);
matchedEquipments = this.refineByIndustry(this.model.divisions, matchedEquipments);
this.displayClientData(matchedEquipments);
this.updateSearchCounters(SelectionFilter.FreeText);
}
规格:
it('verify the result with search', async(() => {
equipmentSelectionComponent.searchByText("123");
//equipmentSelectionComponent.model.searchText = "123";
expect(equipmentSelectionComponent.matchedData.length).toBeGreaterThan(0);
}));
以下测试用例应该能够包含您的测试用例
if condition : 当searchText有值时,应该通过修改设备分配给matchedEquipments
期望:
refineByText toHaveBeenCalledWith(textVal, this.equipments)
else 条件:当 searchText 没有值时,应将设备分配给 matchedEquipments
期望:
refineByText not.toHaveBeenCalledWith(textVal, this.equipments)
您需要编写不止 1 个 it
块来测试它:
it('should call "refineByText" when search Text is there', async(() => {
spyOn(equipmentSelectionComponent,'refineByText').and.callThrough();
equipmentSelectionComponent.model.searchText = "some Val";
equipmentSelectionComponent.equipments = ["item1"]
equipmentSelectionComponent.searchByText("123");
expect(equipmentSelectionComponent.refineByText).toHaveBeenCalledWith("123",["item1"]); // <-- this will check true condition
// I dont see "matchedData" in your provided code so I dont know about this check.
expect(equipmentSelectionComponent.matchedData.length).toBeGreaterThan(0);
// spy and check other function calls as well just like I did for refineByText
}));
it('should not call "refineByText" when search Text is empty', async(() => {
spyOn(equipmentSelectionComponent,'refineByText').and.callThrough();
equipmentSelectionComponent.model.searchText = "";
equipmentSelectionComponent.searchByText("123");
expect(equipmentSelectionComponent.refineByText).not.toHaveBeenCalled(); // <-- this will check true condition
// similarly use use "toHaveBeenCalledWith(val) for other functions
}));
我建议您阅读 angular 的 testing with spies and also some more basic testing ways。这将帮助您更加熟悉单元测试的思维方式。也请随意鼓掌! :)