Javascript 如何模拟嵌套方法?

Javascript 如何模拟嵌套方法?,javascript,unit-testing,jasmine,jasmine2.0,Javascript,Unit Testing,Jasmine,Jasmine2.0,我正在学习更多关于Jasmine单元测试的知识,我遇到了一些我无法理解的事情。我对JavaScript和单元测试都是新手。我试图寻找有关嵌套方法的示例并对其进行模拟,但仍然无法进行成功的测试。我正在用PhaserJS(HTML5游戏库)制作一个游戏,到目前为止,我已经编写了成功的测试。这是我成功测试的一个例子 function createGameScreenBorder(gameState) { var border = gameState.game.add.graphics()

我正在学习更多关于Jasmine单元测试的知识,我遇到了一些我无法理解的事情。我对JavaScript和单元测试都是新手。我试图寻找有关嵌套方法的示例并对其进行模拟,但仍然无法进行成功的测试。我正在用PhaserJS(HTML5游戏库)制作一个游戏,到目前为止,我已经编写了成功的测试。这是我成功测试的一个例子

 function createGameScreenBorder(gameState) {
      var border = gameState.game.add.graphics();
    }
这是我的测试块

it("create gamescreen background border", function() {
    gameState.game = {
    add: jasmine.createSpyObj('add', ['graphics'])
    };
      createGameScreenBorder(gameState);
      expect(gameState.game.add.graphics).toHaveBeenCalled();
    });
    it("create gamescreen background border", function() {
          gameState.game = {
            add: {
              graphics: jasmine.createSpyObj('graphics', ['drawRect'])
            }
          }
          createGameScreenBorder(gameState);
          expect(gameState.game.add.graphics).toHaveBeenCalled();
          expect(gameState.game.add.graphics().lineStyle).toHaveBeenCalledWith(0,0,0,0);
        });
现在上面的代码可以工作了,它没有做多少工作。我想画一个矩形,它是图形方法的一部分

function createGameScreenBorder(gameState) {
      var border = gameState.game.add.graphics();
          // drawRect: x, y width, length
          border.drawRect(0, 0, 0, 0);
      }
这是我的测试块

it("create gamescreen background border", function() {
    gameState.game = {
    add: jasmine.createSpyObj('add', ['graphics'])
    };
      createGameScreenBorder(gameState);
      expect(gameState.game.add.graphics).toHaveBeenCalled();
    });
    it("create gamescreen background border", function() {
          gameState.game = {
            add: {
              graphics: jasmine.createSpyObj('graphics', ['drawRect'])
            }
          }
          createGameScreenBorder(gameState);
          expect(gameState.game.add.graphics).toHaveBeenCalled();
          expect(gameState.game.add.graphics().lineStyle).toHaveBeenCalledWith(0,0,0,0);
        });
我希望能够确保使用我的参数调用drawRect(),但我不知道该怎么做


谢谢大家!

gameState.game.add.graphics()返回一个包含
drawRect()方法的对象

首先,您要检查是否调用了
gameState.game.add.graphics()
,这已经完成。然后检查是否对此方法返回的对象调用了
drawRect()
。要做到这一点,设置你的间谍返回一个同样有间谍的对象

it("create gamescreen background border", function() {
  let resultObject = {
    drawRect: jasmine.createSpy()
  };

  gameState.game.add = {
    graphics: jasmine.createSpy().and.callFake(() => {
      return resultObject;
    })
  };

  createGameScreenBorder(gameState);

  expect(gameState.game.add.graphics).toHaveBeenCalled();
  expect(resultObject.drawRect).toHaveBeenCalledWith(0, 0, 0, 0);
});

非常感谢你。这帮了大忙!!