2015-12-28 3 views
0

В настоящее время я создаю игру Rock, Paper, Scissors в Javascript и использую TDD для руководства своим кодом. Я пытаюсь запустить тест Жасмин, который заставляет одну из моих функций вернуть установленное значение. Я хочу, чтобы моя функция «compChoice» возвращала случайный элемент из массива «choice» [«Rock», «Paper», «Scissors»], и в моем тесте вы хотите установить это «Rock». Мои тесты ниже.Функция spyOn в Jasmine, которая возвращает случайный элемент из массива

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“.»

Я не знаю, почему он не звонит шпиону и устанавливает значение «Рок», как я и спросил.

Мой фактический код внизу для справки:

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

Похоже, вы не применяла подсмотрел метод. Вы определяете в шпионе, что должно произойти, когда функция вызывается так в вашем случае

spyOn(game,'compChoice').and.returnValue("Rock"); 

Вы определили, что функция compChoice из игрового объекта должен быть прослежен и при вызове, что он должен вернуть «Rock» значение. В следующей строке вы ожидаете

expect(game.opponentChoice).toEqual("Rock") 

Так вы проверить здесь, если атрибут объекта opponentChoice установлен в «Rock» Но вы пропустите, чтобы вызвать метод compChoice, который должен установить значение opponentChoice. Вы должны вставить это

game.compChoice(); 

между spyOn и ожидать в вашем коде.

EDITED:

Хорошо, теперь я вижу, что происходит. Шпион создает макет для метода compChoice. Но это всего лишь макет, и вы определили, что этот макет должен вернуть значение «Rock». Но на самом деле эта издевающаяся функция не работает, как обычный метод compChoice. Таким образом, он не присваивает игроку игрового объекта значение enemyChoice. Он возвращает только значение «Rock», как вы определили.

Это также выглядит немного странно, потому что это не модульный тест. Это больше похоже на интеграционный тест. Вы пытаетесь проверить, как эти методы работают вместе. Поэтому я думаю, что Жасмин не подходит для такого рода тестов. Однако, если вы действительно хотели бы, чтобы проверить это поведение, которое вы можете использовать callFake метода следующим образом:

spyOn(game,'compChoice').and.callFake(function(){ 

       game.opponentChoice = "Rock"; 
       return "Rock"; 
}); 

В этом случае вы вызываете поддельные функции, которые присваивают также opponenChoice значения.

+0

был ли этот ответ полезным для вас? –

+0

Извините за отсутствие ответа Артур и благодарю вас за ответ! Я был так неспособен ответить. Я попытался выполнить то, что вы рекомендовали, и вызвал функцию compChoice() после Spy, и она не сработала. Когда я console.log (game.opponentChoice) ничего не возвращает, когда я ожидал, что Rock будет возвращен из-за SpyOn. –

+0

Я отредактировал свой предыдущий ответ с объяснением, почему он не работает –

Смежные вопросы