如何模拟嵌套方法?

问题描述 投票:0回答:1

我正在学习更多有关Jasmine Unit Testing的知识,而且我遇到了一些我无法弄清楚的问题。我是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();
    });

现在上面的代码工作,它没有做太多。我想要的是绘制一个矩形,它是图形方法的一个方法部分。

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: {
              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(),但我对如何操作感到困惑。

谢谢!

javascript unit-testing jasmine jasmine2.0
1个回答
1
投票

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);
});
© www.soinside.com 2019 - 2024. All rights reserved.