ScalaTest を使用して、Scala で記述したパーサーをテストしています。パーサーは一度に 1 つのファイルを処理し、次のようなシングルトン オブジェクトを持ちます。
class Parser{...}
object Resolver {...}
私が書いたテストケースは、このようなものです
describe("Syntax:") {
val dir = new File("tests\\syntax");
val files = dir.listFiles.filter(
f => """.*\.chalice$""".r.findFirstIn(f.getName).isDefined);
for(inputFile <- files) {
val parser = new Parser();
val c = Resolver.getClass.getConstructor();
c.setAccessible(true);
c.newInstance();
val iserror = errortest(inputFile)
val result = invokeparser(parser,inputFile.getAbsolutePath) //local method
it(inputFile.getName + (if (iserror)" ERR" else " NOERR") ){
if (!iserror) result should be (ResolverSuccess())
else if(result.isInstanceOf[ResolverError]) assert(true)
}
}
}
各反復で、シングルトン オブジェクト Resolver 内の以前の反復の副作用はクリーンアップされません。
シングルトン オブジェクトを再初期化するモジュールを scalatest に指定する方法はありますか?
更新: ダニエルの提案を使用して、コードを更新し、詳細も追加しました。
更新:どうやら怪しいことをしているのはパーサーです。後続の呼び出しでは、前の AST は破棄されません。変。これは話題から外れているので、もっと掘り下げて、おそらく議論のために別のスレッドを使用します。答えてくれてありがとう
最終更新: 問題はリゾルバー以外のシングルトン オブジェクトにあり、他のファイルにあったため、どういうわけか見逃していました。Daniel Spiewak の返信を使用してこれを解決できました。それは物事を行うための汚い方法ですが、私の状況と、本番環境で使用されないテストコードを書いているという事実を考えると、それが唯一のことでもあります。