2015-11-23 34 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