我试图通过对基本方法执行简单的茉莉花测试来增加我项目中的代码覆盖率。在我的控制器中,我有这个:
function fetchStates() {
$repository.states().all().then(function(data) {
vm.states = data;
});
}
我正在尝试设置 vm.states,但绝对没有我尝试过的东西会触发它。我可以模拟一个存储库,这样 jasmine 就不会抱怨它不存在,但是当我尝试运行 controller.fetchStates(); 时它根本不会到达代码的内部行。模拟 $repository.states().all().then 的正确方法是什么,以便它允许 vm.states = data?
function GetMockFacRepo() {
var facilityPromise = new Promise((resolve, reject) => {
resolve({ id: 1 });
});
return {
states: function () {
return {
id: 0,
all: function () {
then:
{
return facilityPromise
}
}
}
}
};
}
var repo2 = GetMockFacRepo();
spyOn(repo2.states.all, "then").and.callFake(function () { return 1 });
尝试以下操作:
function GetMockFacRepo() {
var facilityPromise = new Promise((resolve, reject) => {
resolve({ id: 1 });
});
return {
states: function () {
return {
id: 0,
all: function() {
// return facilityPromise here so .then works
return facilityPromise;
}
}
}
};
}
在断言
vm.states = data;
之前,您可能还必须等待承诺解决。在 Angular 2+ 中,您可以使用 fakeAsync/tick
和 fixture.whenStable()
。我不确定你可以在 Angular 1 中使用什么。
它最终成为显式模拟存储库的组合,创建我自己的承诺而不是使用 q,和使用异步调用控制器构造函数。
回购代码:
var mockRepo = {
states: function () {
return {
all: function () {
var items = [];
var i = 0;
for (i = 0; i < 5; i++) {
items.push(i);
}
var sectionPromise = new Promise((resolve, reject) => {
resolve(items);
});
return sectionPromise;
}
}
},
}
测试:
describe('POC', function () {
beforeEach(async function () {
controller = createController();
});
it('POC', function () {
expect(controller.states.length).toEqual(5);
});
});
编辑:控制器调用在内部填充状态属性的方法,我不必显式调用它来获取填充的属性