嵌套描述函数中对象的单个模拟(茉莉花

single mock of object in nested describe functions (jasmine

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

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

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 定义了它,而 beforeEach 在开始任务 A 时定义了 FOO 运行 但仅限 FOO,因此 sub1 和 sub2 共享相同的 FOO。对吗?

假设它是正确的,我怎样才能在 describe 的最顶层添加一个间谍,同时还要确保每次在测试中使用该对象时都生成新的对象,每次都只生成所需的间谍?

使用 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();
   });
});