Jasmine中的spyOn函数,从数组中返回随机元素

时间:2015-12-28 15:42:32

标签: javascript jasmine stub spy

我目前正在使用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;
 }

1 个答案:

答案 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值。