Jasmine spyOn javascript getter导致业力挂起

时间:2015-07-10 10:12:01

标签: javascript jasmine ecmascript-6

我在使用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语法定义的其他方法,因此我确信用于转换的构建管道工作正常。

有没有人见过这个,或者对修复有任何想法?

2 个答案:

答案 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');
    });
});