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; // 恢复
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现