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; // 恢复
posted @   zjh6  阅读(16)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示