Unit testing 用于单元测试的内存文件

Unit testing 用于单元测试的内存文件,unit-testing,mocking,d,Unit Testing,Mocking,D,我想为打印到标准输出的方法编写一个单元测试。 我已经更改了代码,因此它将打印到传入的文件实例,而默认情况下,该实例是stdout。我唯一缺少的是一些可以传入的内存文件实例。有这样的事吗?有什么建议吗?我希望这样的事情能奏效: import std.stdio; void greet(File f = stdout) { f.writeln("hello!"); } unittest { greet(inmemory); assert(inmemory.content

我想为打印到标准输出的方法编写一个单元测试。 我已经更改了代码,因此它将打印到传入的
文件
实例,而默认情况下,该实例是
stdout
。我唯一缺少的是一些可以传入的内存
文件
实例。有这样的事吗?有什么建议吗?我希望这样的事情能奏效:

import std.stdio;

void greet(File f = stdout) {
    f.writeln("hello!");
}

unittest {
    greet(inmemory);
    assert(inmemory.content == "hello!\n")
}

void main() {
    greet();
}

打印到标准输出的单元测试代码的任何其他方法

而不是依赖相当低级的
文件
,通过接口传递对象

正如您在评论中所提到的那样,Java中的OutputStreamWriter是许多接口的包装器,设计用于对字节流等进行抽象。我也会这样做:

interface OutputWriter {
    public void writeln(string line);
    public string @property content();
    // etc.
}

class YourFile : OutputWriter {
    // handle a File.
}

void greet(ref OutputWriter output) {
    output.writeln("hello!");
}

unittest {

    class FakeFile : OutputWriter {
        // mock the file using an array.
    }

    auto mock = new FakeFile();

    greet(inmemory);
    assert(inmemory.content == "hello!\n")
}

这需要跨平台吗?不需要;例如,不同平台上的新线可能不同。我不想测试这方面,只想测试可打印的内容。因此,我需要Java中类似于
OutputStreamWriter
的东西,而不是
File
,也就是说,我将停留在unicode字符的级别,而不是编码、文件系统等。如果我的测试在所有平台上运行,那将是非常好的…谢谢!我希望标准图书馆也能提供类似的设施。或者一些模拟工具来避免“生产”代码中的样板文件。这种方式writeln的所有功能都不适用于生产代码。这里有许多可用的单元测试库:我编写的一个包含模拟功能。谢谢我开始找。。。当然,我更喜欢没有外部依赖的东西。。现在我只跳过这部分的单元测试。:)