d测试返回空的函数
原文
我有下面的类:
class A {
int[] array;
...
void print() {
writeln("array = ", this.array);
}
}
是否可用assert来测试print函数,对stdout的输出,如下?
A myClass= new A;
myClass.array = [1,2];
assert(myClass.print() == "array = [1,2]");
可重定向stdout到你选的文件,再测试该文件.
尽管最好按参数来打印某种输出区间或Appender,然后再测试它.
最简单方法是修改函数,使其可输出到非stdout,让它输出到unittest中的一个文件,并检查文件内容来验证结果.
如:
import std.stdio;
class A
{
int[] a;
this(int[] a) { this.a = a; }
void print(File output = stdout) {
output.writeln("array = ", this.a);
}//输出
}
unittest {
import std.file;
A a = new A([1, 2]);
a.print(File("test.txt", "wb"));
assert(readText("test.txt") == "array = [1, 2]\n");
//断定内容.
}
类似PaulBackus的程序,但我会尽量避免单元测试中使用文件系统.这里,可打印到接收器(sink)中:
import std.stdio;
class A
{
int[] a;
this(int[] a) { this.a = a; }
void toString(scope void delegate(in char[]) sink) const {
import std.conv : text;
sink("array = ");
sink(this.a.text);
// 或this.a.to!string
// 较重量级替代:
// import std.format : formattedWrite;
// sink.formattedWrite!"array = %s"(this.a);
}
void print() {
writeln(this);
}
}
unittest {
import std.file;
A a = new A([1, 2]);
import std.conv : text;
assert(a.text == "array = [1, 2]");
}
void main() {}
toString是对象的文本表示.如果不想得到相同输出,可用与toString不同的名,但这时必须使用显式的"sink",最好上面.
或,可模板化File,使其可与模拟对象交换:
void myfunc(File = std.stdio.File)(File output = stdout) {
output.writeln(...);
}
unittest {
struct MockFile {
string output;
void writeln(Args...)(Args args) {
output ~= format(args);
}
}
MockFile mock;
myfunc(mock);
assert(mock.output == ...);
}
出于文档目的,如果想重定向,可如下(未经测试).
auto original = stdout; // 保存
stdout.open(newdest, "wt"); // 重定向
// 干活.
stdout = original; // 恢复
浙公网安备 33010602011771号