想知道是否有人可以帮助我 - 我尝试使用Jasmine(1.3)测试我的js并且我无法找出在.then或.done中测试任何方法调用的最佳方法方法
示例代码解释:
Backbone.View.extend({
myMethod: function () {
this.something.done(function () {
this.doSomethingElse();
}.bind(this));
}
})
我想编写一个测试来检查this.doSomethingElse是否被调用。
我正在环顾jasmine.async和waitsFor / runs设置,但我不确定它是如何适应外部代码的,即我不打算在我的实际代码中调用done()让我的测试工作。另外,如果我在this.something上模拟完成方法,那么我不再测试实际的实现了,对吗?
我只是想知道事情是如何融合在一起的。如果有人能指出我正确的方向,我真的很感激它!
更新:根据以下反馈,我现在尝试以下
嘿,谢谢你的回答 - 我想也许我没有最后一部分是正确的 - 尝试了两种不同的方式,既有初始通过,但在一秒钟或2秒后失败。 it('calls doSomethingElse on done',function () {
var mockDeferred = $.Deferred();
myView.something = mockDeferred;
spyOn(myView,'doSomethingElse');
mockDeferred.resolve();
waitsFor(function () {
expect(myView.doSomethingElse).toHaveBeenCalled();
});
});
还有:
it('calls doSomethingElse on done',function () {
var mockDeferred = $.Deferred(),
someTrigger = false;
myView.something = mockDeferred;
spyOn(myView,'doSomethingElse');
runs(function () {
mockDeferred.resolve();
someTrigger = true;
});
waitsFor(function () {
someTrigger = true;
});
runs(function () {
expect(myView.doSomethingElse).toHaveBeenCalled();
});
});
在这两种情况下,测试将最初通过,但在一秒钟或2秒后超时到失败。
我错过了什么吗?
答案 0 :(得分:2)
要测试您描述的示例函数,我会在您的测试中执行以下 :
mockDeferred
)mockDeferred
传递到您正在测试的代码中,以便现在在您的示例中this.something
doSomethingElse
函数myMethod()
resolve()
mockDeferred
doSomethingElse
被称为根据OP的更新进行编辑:
我不会在您的测试中的任何一个示例中看到您在测试中调用myView.myMethod()
的位置;确保你这样做。我举了一个例子,你可以参考here。
顺便说一句,我对你最初试过的第二个例子感到惊讶。也许是因为你有一些runs()
块以外的代码?
答案 1 :(得分:0)
相关问题
监视
.then
内部的方法并期望.toHaveBeenCalled
失败
解决方案:
在
fakeAsync
内部运行测试,并在tick()
之前运行expect
服务:
getFirebaseDoc() {
this.db.firestore.doc('some-doc').get()
.then(this.getFirebaseDocThen)
.catch(this.getFirebaseDocCatch);
}
单元测试:
it('should call getFirebaseDocThen', fakeAsync(() => { // note `fakeAsync`
spyOn(service, 'getFirebaseDocThen');
spyOn(service.db.firestore, 'doc').and.returnValue({
get: (): any => {
return new Promise((resolve: any, reject: any): any => {
return resolve({ exists: true });
});
},
});
service.getFirebaseDoc();
tick(); // note `tick()`
expect(service.getFirebaseDocThen).toHaveBeenCalled();
}));