jasmine:类的模拟实例

时间:2014-03-26 07:55:56

标签: javascript tdd jasmine

是否可以创建对象 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

目前我被迫编写了一些测试

  1. it('如果参数是字符串,则会引发错误')
  2. it('如果参数是数组,则会引发错误')
  3. ...
  4. 这有点烦人。我期待像

    这样的命令
     var fakeB = jasmine.createFake('B')
    

    这样这个问题的第一行代码就会通过。

2 个答案:

答案 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