是否可以创建对象 obj 的模拟,以便像Jasmine测试一样
expect(fakeB instanceof B).toBe(true);
通过?
换句话说,我有一个 A 类,其方法是 convertToB ,该参数必须是类 B 的实例:
function A(){
this.convertToB = function(elem){
if (!(elem instanceof B)){ throw an error}
...
...
}
}
我想通过创建一个模拟对象来测试该段代码,当被问及是否是 B 的实例时,它会响应 true 。
目前我被迫编写了一些测试
这有点烦人。我期待像
这样的命令 var fakeB = jasmine.createFake('B')
这样这个问题的第一行代码就会通过。
答案 0 :(得分:5)
我的代码中有几十个地方和你的一样。 spyOn方法的Jasmine 2.0将完成这项工作。与Jasmine 1.0相同,但我不记得该方法是否以完全相同的方式调用/使用。例如:
var realB = new B();
// change realB instance into a spy and mock its method 'foo' behaviour to always return 'bar'
// it will still respond "true" to "realB instanceof B"
spyOn(realB, 'foo').and.returnValue('bar')
var realC = new C();
// C.baz is expecting instance of B to be passed as first argument
var result = C.baz(realB)
// assuming C.baz return realB.foo() concatenated with '123'
expect(result).toEqual('bar123');
Jasmine文档中有大量间谍示例列表:http://jasmine.github.io/2.0/introduction.html
答案 1 :(得分:0)
我的实施如下:
function proxyConstructor(obj) {
obj = obj || {};
for (var key in obj) {
this[key] = obj[key];
}
this.prop = 'runtime prop';
this.instanceMethod(1);
}
var TestClass = jasmine.createSpy(`TestClass.constructor`).and.callFake(proxyConstructor);
TestClass.prototype.instanceMethod = jasmine.createSpy(`TestClass#instanceMethod`);
TestClass.staticMethod = jasmine.createSpy(`TestClass.staticMethod`);
var ins = new TextClass();
expect(ins).toBe(jasmine.any(TestClass)) // success
expect(ins.prop).toBe('runtime prop'); // success
expect(ins.instanceMethod.toHaveBeenCalledWith(1)) // success