Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

TestCaseその7 htmlunitとの併用

jsでのdomのテストなどを行う際、テストデータとしてのhtmlが欲しくなる。
で前から言ってるようにhtmlunitを流用しちゃおうという話。
もうね。つべこべいうのやめた。
いきなりソース張るw

ScriptablePageLoader

package org.seasar.teeda.extension.spike.rhino;

import java.io.File;
import java.net.URL;

import org.mozilla.javascript.ScriptableObject;

import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.TopLevelWindow;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebWindow;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class ScriptablePageLoader {

    public ScriptableObject load(String file) throws Exception {
        File f = new File(file);
        URL url = f.toURL();

        WebClient client = new WebClient();
        Page page = client.getPage(url);
        WebWindow window = new TopLevelWindow("", client);
        window.setEnclosedPage(page);
        HtmlPage html = (HtmlPage) page;
        return (ScriptableObject) html.getScriptObject();
        
        //parentScope version
        //ScriptableObject object = (ScriptableObject) html.getScriptObject();
        //return (ScriptableObject)object.getParentScope();

    }

}

この時点で"document"など使えます。
なので要素でassertなどなんでもできます。
使える関数はhtmlunit依存です。
いつもなら

ScriptableObject scope = cx.initStandardObjects();

だけどhtml指定ありの場合にScriptablePageLoaderを使ってそいつをscopeにしちゃえば良いかなと。

RhinoTestCase.java

ScriptableObject scope = null;
String htmlPath = this.getClass().getName();
htmlPath = htmlPath.replace('.', '/') + ".html";
URL url = loader.getResource(htmlPath);
htmlPath = url.getFile();
if (new File(url.getFile()).exists()) {
	ScriptablePageLoader pageLoader = new ScriptablePageLoader();
        scope = pageLoader.load(htmlPath);
} else {
	scope = cx.initStandardObjects();
}

あとは通常とおりのRhinoTestCaseでjsのunitcaseで書いてもらえればよろしいです。
はい。

FooTest.js

function testHoge1(){
	var ele = document.getElementById("test");
	var name = ele.nodeName;
	assertEquals(name, 'DIV');
}

FooTest.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>Insert title here</title>
</head>
<body>

<div id="test"></div>
</body>
</html>

これ以上はちょっとギブかも…。
一応もう少しごにょごにょできますけどね。
追記
ちょっとだけ修正、追加しました。

うくく。