我目前正在使用Javascript构建Rock,Paper,Scissors游戏并使用TDD来指导我的代码。我正在尝试运行Jasmine测试,强制我的一个函数返回一个设定值。我希望我的“compChoice”函数从'choices'数组[“Rock”,“Paper”,“Scissors”]中返回一个随机元素,并且在我的测试中想要将其设置为'Rock'。我的测试如下。
describe("Game", function() {
var game;
beforeEach(function(){
game = new Game();
});
describe('user choice', function(){
it('should equal the choice the user selected', function(){
game.userSelect("Rock");
expect(game.userChoice).toEqual("Rock")
});
})
describe('draw', function(){
it('should equal true if user choice and comp choice are the same', function() {
game.userSelect("Rock");
spyOn(game,'compChoice').and.returnValue("Rock");
expect(game.opponentChoice).toEqual("Rock")
// expect(game.draw).toEqual(true);
});
})
});
我可以告诉我的spyOn有问题,因为我的测试回来了“预期”'等于'Rock'。“
我不知道为什么它没有调用间谍并像我问的那样将值设置为“Rock”。
我的实际代码在下面作为参考:
function Game() {
this.choices = ["Rock","Paper","Scissors"];
this.userChoice = "";
this.opponentChoice = "";
}
Game.prototype.userSelect = function(choice){
this.userChoice = choice;
}
Game.prototype.compChoice = function(){
this.opponentChoice = this.choices[Math.floor(Math.random()*this.choices.length)];
return this.opponentChoice;
}
答案 0 :(得分:0)
看起来你没有调用间谍方法。你可以在间谍中定义在调用函数时应该发生什么,所以在你的情况下
JoinLocaliCaja
你已经定义了,来自游戏对象的函数compChoice应该被监视,并且当它被调用时它应该返回“Rock”值。在下一行,您可以期待
spyOn(game,'compChoice').and.returnValue("Rock");
因此,如果对象属性 expect(game.opponentChoice).toEqual("Rock")
设置为“Rock”,请在此处查看
但是你错过了调用方法compChoice,它应该设置opponentChoice
的值。你应该粘贴这个
opponentChoice
在代码中spyOn和expect之间的。
<强>编辑:强>
好的,现在我看到发生了什么。间谍正在为compChoice方法创建一个模拟器。但它只是一个模拟而且你定义了这个模拟应该返回“Rock”值。但实际上这个模拟函数不像普通的compChoice方法那样工作。因此它不会将opponentChoice值赋给游戏对象。它只返回您定义的“Rock”值。
它看起来也很奇怪,因为它不是单元测试。它更像是集成测试。您正试图测试这些方法如何协同工作。所以我认为Jasmine不适合这种测试。但是,如果您真的想测试此行为,可以通过以下方式使用 callFake 方法:
game.compChoice();
这样你就可以调用伪函数,它也分配了opponenChoice值。