我知道直接在unitTests中调用私有函数不是一个好习惯,我们必须通过公共方法测试私有代码。
我遇到的情况是我不知道如何实现我的目标。我想知道是否已从我的间隔调用回调函数。这是在角度控制器中实现的。
function prepareInterval() {
self.callbacksData = [];
if(self.DynamicValuesList !== null) {
self.myPromise = $interval(callbackFunction, userInputInterval * 1000);
}
}
我的回调函数只显示来自callbackFunction的数据。如果调用了callbackFunction,我想要unitTest,但我不能。
我尝试了https://makandracards.com/makandra/32477-testing-settimeout-and-setinterval-with-jasmine
it('myUnitTest', function(){
//Prepare data
var controller = createController();
spyOn(controller, 'callbackFunction');
expect(controller.callbackFunction).not.toHaveBeenCalled();
});
我得到的错误是。
编辑:顺便说一句,我在beforeEach函数中注入角度模拟callbackFunction()方法不存在
答案 0 :(得分:1)
我会采取略微不同的方法。
显然你不希望callbackFunction
本身暴露,所以不要。保密。
但是,您可以将其作为值返回到self
实例。
self.myPromise = $interval(callbackFunction, userInputInterval * 1000);
所以你测试的是self.myPromise
值。如果该值包含间隔,则已设置间隔,因此您可以非常确定已调用方法。
我希望self
对象是控制器,所以你可以像这样测试self.myPromise
的值:
it('myUnitTest', function(){
//Prepare data
var controller = createController();
expect(controller.myPromise).toBe( /* undefined? */);
});
<强>更新强>
仅测试间隔值&gt; 0:
您可以尝试重构可测试性。我不确定stringmatcher是否适用于数字,现在我没有时间进行测试:)
function prepareInterval() {
self.callbacksData = [];
if(self.DynamicValuesList !== null) {
self.myPromise = $interval;
self.myPromise(callbackFunction, userInputInterval * 1000);
}
}
it('myUnitTest', function(){
//Prepare data
var controller = createController();
spyOn(controller, 'myPromise');
expect(controller.myPromise).toHaveBeenCalledWith(jasmine.any(Function), jasmine.stringMatching(/^[1-9][0-9]*$/));
});