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