Is there a File-like object for unit tests?

H. S. Teoh hsteoh at quickfur.ath.cx
Tue Jan 4 18:12:37 UTC 2022


On Tue, Jan 04, 2022 at 05:01:41PM +0000, Amit via Digitalmars-d-learn wrote:
> Hi!
> 
> I wrote a text parser that takes a File argument and parses that
> file's contents. Now I would like to write a unit-test for that
> parser. I need a File (or a general IO interface) that reads from an
> in-memory buffer, similar to python's `StringIO` or go's
> `strings.Reader`.
> 
> How can I achieve that?
> 
> Example of what I have in mind:
> 
> ```d
> unittest {
>     string fakeContents = "foo\nbar\nbaz";
>     File f = createFileFromString(fakeContents);
>     assert(myParse(f) == MyParsedObject(...));
> }
> ```

It's very easy, just have your text parser take File as a template
argument, defaulted to std.file.File, that your unittest(s) can override
with a custom type containing the needed methods. For example:

	auto myParser(File = std.stdio.File)(File input) {
		... // read input as usual
	}

	unittest {
		struct FakeFile {
			string contents = "...";
			void[] rawRead(void[] buf) {
				... // simulate a file read here
			}
			... // add whatever other File methods you might need here
		}
		FakeFile f;
		auto output = myParser(f);
		...
	}

	void main() {
		auto input = File("...", "r");
		auto output = myParser(input); // `File` defaults to std.stdio.File
		...
	}


T

-- 
"A man's wife has more power over him than the state has." -- Ralph Emerson


More information about the Digitalmars-d-learn mailing list