嵌套描述函数中的单个模拟对象(jasmine

时间:2015-03-17 17:54:22

标签: javascript angularjs testing jasmine

如果我有一个带有嵌套的describe方法的jasmine规范,并且我想在方法上放置一个间谍,让它返回一个特定的结果,一旦跨越所有方法,什么是正确的方法?我知道我可以简单地在顶级方法中定义间谍,但是,这是否意味着我的一些测试获得了相同的对象?我不希望在另一个测试中保持更改,即使它允许代码重用。

所以,如果我有这样的事情:

describe ('tope level test', function(){ 
   var FOO;

   beforeEach( module ('FooBar') );

   beforeEach( inject (function( _Foo_){
        FOO=_Foo_;
        FOO.bar=jasmine.createSpy('foobar').andReturn("baz");
   }));

    describe('test A', function(){

       if('sub1', function(){
           FOO.newMethod=function() {'this shouldn't exist'};
        });

       if('sub2', function(){
          FOO.newMethod();
       });
 })]);

我认为sub2能够访问newMethod,因为sub1定义了它,并且定义FOO的beforeEach仅在启动任务A但仅在FOO运行,因此sub1和sub2共享相同的FOO。这是对的吗?

假设它是正确的,我怎么能在最高级别的描述中添加间谍,同时还确保每次在测试中使用时都会生成对象,每次只需要所需的间谍?

1 个答案:

答案 0 :(得分:0)

使用Object.create()创建对象的新实例:

describe ('tope level test', function(){ 
  var FOO;

  beforeEach( module ('FooBar') );

  beforeEach( inject (function( _Foo_){
    FOO = Object.create(_Foo_);
    FOO.bar = jasmine.createSpy('foobar').andReturn("baz");
  });

  describe('test A', function(){

   if('sub1', function(){
      FOO.newMethod = function() {'this shouldn\'t exist'};

      expect(FOO.bar).toBeDefined();
      expect(FOO.newMethod).toBeDefined();
    });

   if('sub2', function(){
      expect(FOO.bar).toBeDefined();
      expect(FOO.newMethod).not.toBeDefined();
   });
});