2016-11-24 15 views
0

Попытка проверить объект JavaScriptКак проверить свойство объекта Javascript, когда функция с мокко, Chai

Game.js

var GameManager= { 
    gameType: 'room', 
    roomDimension: [10,10], 
    playerDirection: ["W"] 
    possibleDirections: ["N","E","S","W"], 
    init: function(){ 
     if(this.gameType == 'room'){ 
      regexpNumber = /^-?[0-9]$|-?([1][0-9])$/; 
     } 
    return true; 
    }, 
    turnRight : function(){ 
    var movePosition = this.possibleDirections.indexOf(this.playerDirection); 
    if(movePosition == this.possibleDirections.length -1){ 
     return this.possibleDirections[0]; 
    } 
    return this.possibleDirections[movePosition + 1]; 
    }, 
    commandString: function(string){ 
    var command = /^[PQR]*$/; 

    if(command.test(string){ 
     return true; 
    } 
    this.errorMessageNumber = 0; 
    return false; 
} 
} 

Вот мой тестовый скрипт test.js

var expect = require("chai").expect; 
var GameManager = require("../GameManager.js"); 

describe("Test game type", function() { 
    beforeEach(function() { 
     GameManager.gameType = 'room'; 
     GameManager.roomDimension= [10, 10]; 
     GameManager.possibleDirections: ["N","E","S","W"]; 
    }); 

    it('should commandString be as parameters', function() { 
    expect(GameManager.commandString("AABB")).to.not.be.false; 
    }); 

    it('should init toBeTruthy', function() { 
    expect(GameManager.init()).ok; 
    }); 
}); 

Ошибка: В обоих случаях ошибка теста с ошибкой TypeError показана ниже для одного из t он тест:

1) Test game type should init toBeTruthy: 
    TypeError: GameManager.init is not a function at Context.<anonymous> 

Поскольку init не рассматривается как функция здесь, как это может быть проверена?

+0

Ожидание в тесте выглядит нормально, может быть 'Const ожидать = требуется («chai»). ожидать, что вы импортируете chai. – Hosar

+1

Также как вы экспортировали GameManager? – Hosar

+0

@Hosar Изменен код на 'var expect = require (" chai "). Ожидать;' И я не экспортирую GameManager, так как это простой объект Javascript. Не используется в качестве класса экспорта '' Typcript''. – shaz

ответ

0

Почему вы пытаетесь протестировать простой объект? Я думаю, хотя это можно сделать, UT больше предназначены для поведенческих тестов.

То есть, я думаю, что вы используете утверждать, неправильно:

it('should init toBeTruthy', function() { 
    expect(GameManager.init()).to.be.ok; 
}); 

Или быть более точным с тестом:

it('should init toBeTruthy', function() { 
    expect(GameManager.init()).to.be.true; 
}); 

Кроме того, вы можете сослаться на этот пост, его может быть полезным

Why is my mocha/chai Error throwing test failing?

0

Вы сказали, что в комментарии:

I am not exporting GameManager since it is a simple Javascript object. Not using as Typescript export class.

Вам все равно необходимо экспортировать его. Является ли это простым объектом JavaScript или нет, совершенно не имеет значения. Вы должны написать свой код таким образом, чтобы он работал с модульной системой Node.js.

Используя код, который вы показать в этом вопросе, и исправление ошибок синтаксиса в нем, я могу получить свой второй тест (тот, для init), чтобы работать, если добавить это к вашему GameManager.js файлу:

module.exports = GameManager; 

С кодом, отображаемым в вопросе, экспортированное значение от GameManager.js равно {}. Поэтому, когда вы делаете var GameManager = require("../GameManager.js");, переменной GameManager присваивается значение {}. Следовательно, GameManager.init имеет значение undefined, и, следовательно, это не функция. Добавление строки, показанной выше, приведет к тому, что переменная GameManager в тестовом файле получит значение GameManager из вашего файла GameManager.js, и тест пройдет.

(Вы не предоставили код для GameManager.commandString поэтому первый тест будет по-прежнему терпят неудачу. Просто добавьте код для того, чтобы заставить его работать.)

+0

Добавлена ​​предлагаемая строка на 'GameManager.js' keep 'var GameManager = require (" ../ GameManager.js ");', но тест всегда терпит неудачу в 'GameManager.gameType = 'room';' как показано 'undefined' и' TypeError: Can not set property ' gameType 'undefined: '. Все изменения не заставили его работать по какой-то причине. – shaz