2015-11-23 35 views
2

如何在我的函數中使對象可用,我將測試?摩卡:使腳本函數中的對象可用於測試

例如。 DOMParser對象。

測試:

import assert from 'assert'; 
import { DOMParser } from 'xmldom'; 
import { parseHtml } from './../src/parse-html.es6'; 

describe('HTML Parser', function() { 
    it('Hello World', function() { 
     parseHtml(); 
    }); 
}); 

parseHtml():

export function parseHtml(html) { 
    const parser = new DOMParser(); 

    return parser.parseFromString(
     `<html><head></head><body>${html}</body></html>`, 
     'text/html' 
    ); 
} 

我將與mochanodejs測試。

+0

這裏有什麼問題?你導入它? –

+0

問題是,DOMParser在parseHtml()中不可用。我怎樣才能使它在這個功能?在parseHtml()中,我使用瀏覽器中的DOMParser。在測試函數中,我從xmldom中導入DOMParser,來「模擬?」它。 – danbruegge

回答

0

我已經解決了這個問題,通過將parseHtml函數重構爲一個類並在我的測試中傳遞了DOMParser()對象。

測試/ parse.js

import chai from 'chai'; 
import xmldom from 'xmldom'; 
import Parse from './../src/parse.es6'; 

const { assert } = chai; 
const { DOMParser } = xmldom; 

let parse; 

describe('Parser', function() { 
    beforeEach(function() { 
     parse = new Parse(DOMParser); 
    }); 

    it('should parse HTML', function() { 
     let html = parse.html(''); 

     assert.ok(html); 
    }); 
}); 

parse.es6

export default class Parse { 
    constructor (domparser) { 
     // This hack is needed for testing. To emulte the browsers DOMParser. 
     this.domparser = !domparser ? new DOMParser() : new domparser(); 
    } 

    html(body) { 
     return this.domparser.parseFromString(
      `<html><head></head><body>${body}</body></html>`, 
      'text/html' 
     ); 
    } 
} 

也得到了更好地延長解析器的好處。 :)

1

你可以使用sinon刺探或存根xmldom類:

import assert from 'assert'; 
import * as sinon from 'sinon'; 
import { parseHtml } from './../src/parse-html.es6'; 
import { default as xmldom } from 'xmldom'; 

// Spy on the xmldom.DOMParser() constructor 
var spy = sinon.spy(xmldom, 'DOMParser'); 

describe('HTML Parser', function() { 
    it('Hello World', function() { 
    parseHtml(); 
    // Check if the constructor was called once (and only once) 
    assert(spy.calledOnce); 
    }); 
}); 

每次測試之前,請務必復位間諜(spy.reset())。

+0

是的,你是對的。在這種情況下,它會起作用。但是我需要'''parse.html();'''的結果。我需要一個真正的解析的HTML。 – danbruegge

+0

@danbruegge我不清楚你到底想要測試什麼。 – robertklep

+0

在其他測試中,我有一個html代碼片段必須放入此html,並且應該被解析。 – danbruegge