如何模拟嵌套方法?
How to mock a nested method?
我正在学习有关 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();
});
现在上面的代码可以工作了,但作用不大。我想要的是绘制一个矩形,它是图形方法的一个方法部分。
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(),但我不知道该怎么做。
谢谢!
gameState.game.add.graphics()
return 是一个具有 drawRect()
方法的对象。
首先你要检查 gameState.game.add.graphics()
是否被调用 - 这已经完成了。然后检查 drawRect()
是否在对象 return 上从该方法调用。为此,请将您的间谍设置为 return 一个也有间谍的对象。
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);
});
我正在学习有关 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();
});
现在上面的代码可以工作了,但作用不大。我想要的是绘制一个矩形,它是图形方法的一个方法部分。
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(),但我不知道该怎么做。
谢谢!
gameState.game.add.graphics()
return 是一个具有 drawRect()
方法的对象。
首先你要检查 gameState.game.add.graphics()
是否被调用 - 这已经完成了。然后检查 drawRect()
是否在对象 return 上从该方法调用。为此,请将您的间谍设置为 return 一个也有间谍的对象。
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);
});