我在使用Jasmine编写一些窥探Javascript getter的测试时遇到了一些问题。它导致我的测试套件挂起(使用karma + phantomJS),然后最终浏览器断开连接,从未进一步超过相关测试。
一个简单的例子可能是最简单的解释方法(使用web6 + babel-loader编译的ES6):
class ExampleClass {
get name() {
return "My Name";
}
}
为了更改此get方法为我的测试返回的内容,我正在尝试以下操作:
describe("example class getter"), function() {
it("should return blue", function() {
let exampleClass = new ExampleClass();
spyOn(exampleClass, 'name').and.returnValue('blue');
expect(exampleClass.name).toBe('blue');
});
});
这导致以下结果(有关测试是我的第7次测试):
PhantomJS 1.9.8 (Mac OS X 0.0.0): Executed 6 of 8 SUCCESS (0 secs / 0.02 secs)
WARN [PhantomJS 1.9.8 (Mac OS X 0.0.0)]: Disconnected (1 times), because no message in 10000 ms.
PhantomJS 1.9.8 (Mac OS X 0.0.0): Executed 6 of 8 DISCONNECTED (10.003 secs / 0.02 secs)
DEBUG [karma]: Run complete, exiting.
spyOn正在使用未使用get语法定义的其他方法,因此我确信用于转换的构建管道工作正常。
有没有人见过这个,或者对修复有任何想法?
答案 0 :(得分:1)
我也一样。这是我解决这个问题的方式:
class Foo {
get status() {
return 0;
}
}
所以嘲笑这个Foo进行测试:
class FooMock extends Foo {
_fakeStatus() {
return 1;
}
get status() {
return this._fakeStatus();
}
}
然后您使用FooMock
代替Foo
! e.g:
it('check the status', () => {
spyOn(fooInstance, '_fakeStatus').and.returnValue(3);
expect(fooInstance.status).toBe(3);
}
希望这适合你! :)
答案 1 :(得分:0)
我认为你忽略了在期待电话中调用name
函数。像这样:
describe("example class getter"), function() {
it("should return blue", function() {
let exampleClass = new ExampleClass();
spyOn(exampleClass, 'name').and.returnValue('blue');
expect(exampleClass.name()).toBe('blue');
});
});