2016-02-04 6 views
0

Я пытаюсь написать тестовый пример для функций без операторов возврата. Можете ли вы рассказать мне, как это сделать? Я написал тестовые случаи, но я не уверен, есть ли его правильноmocha тестовые примеры для разных функций

/** 
* Load sports.js script. That script will execute an analytics sportsView immediately. 
* @returns {undefined} 
*/ 
export function loadsports() { 
    if (typeof sports === 'undefined') { 
     let sportsElement = document.createElement('script'); 
     sportsElement.src = '~^sports, sports.js~^'; 
     sportsElement.async = true; // the script will be executed asynchronously as soon as it is available 

     let firstSportsElement = document.getElementsByTagName('script')[0]; 
     firstSportsElement.parentNode.insertBefore(sportsElement, firstSportsElement); 
    } 
} 

/** 
* Record a sports view in analytics using the data available in aports.ent.sportsData object 
* @returns {undefined} 
*/ 
export function sportsView() { 
    let sportsData = getSportsData(); 

    if (isSportsAvailable() && sportsData) { 
     sports.view(sportsData); 
    } 
} 

/* test case */ 

describe('loadsports test cases', function() { 

    it('loadsports method', function() { 
     console.log("loadsports method"); 
     // sportsAnalytic.sportsView(); 
     expect(true).to.be.true; 
    }); 

}); 

ответ

1

Ваш loadSports функции эффект добавление script тега. Для того, чтобы убедиться, что поведение:

describe('when sports is not loaded', function() { 

    it('adds a script element', function() { 
    loadSports() 
    let sportsElement = document.querySelector(/* target the script tag that should have been appended */) 
    expect(sportsElement).to.exist 
    }) 

}) 

sportsView Ваша функция имеет эффект, хорошо, она имеет множество эффектов: чтение getSportsData(), проверяя, если isSportsAvailable(), а затем вызывая sports.view. Было бы лучше, если бы она приняла его зависимость явно, так что вы можете вводить их во время теста:

// revised 
export function sportsView(getSportsData, isSportsAvailable, sports) { 

    let sportsData = getSportsData() 

    if (isSportsAvailable() && sportsData) { 
    sports.view(sportsData) 
    } 
} 

Теперь вы можете перейти в поддельных реализациях в качестве аргументов sportsView контролировать свое поведение.

import { expect } from 'chai' 
import sportsView from 'path/to/sportsView' 

describe('sportsView', function() { 

    describe('when sports and sportsData is available', function() { 

    it('adds the data to the sports view', function (done) { 

     let someData = {/* some data */} 

     let isSportsAvailable = function() { return true } 
     let getSportsData = function() { return someData } 
     let sports = { 
     view: function(data) { 
      expect(data).to.equal(someData) 
      done() 
     } 
     } 

     sportsView(getSportsData, isSportsAvailable, sports) 
    }) 

    }) 

    describe('when sports is not available...', function() {}) // etc 

}) 

Наличие большого количества глобального состояния делает его действительно трудным или невозможным для проверки вашего кода. Проверьте dependency injection как шаблон, который содержит и контролирует эффекты вашего кода.

Удачи вам!

+0

спасибо за ответ, можно написать тестовые примеры без использования sinon-chai –

+0

да, я обновил ответ. вы можете использовать функцию mocha 'done' для завершения теста после принятия утверждений внутри' sports.view' – thebearingedge

+0

спасибо за ваш ответ ... Я получаю синтаксические ошибки .... confused вы можете обновить код –

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