如何在静态方法中模拟对象

5
如果我有类似以下的内容:
static class ManifestGenerator
{
    public static void GenerateManifestFile(){
    var doc = new XDocument();
    ...
    ... xml stuff added to doc
    ...
    doc.Save(manifestFilePath)
}

现在你能告诉我如何创建一个单元测试来确保该方法生成正确的XML吗?我应该如何使用 Moq 来模拟 XDocument,而不需要向方法调用添加其他参数?

1个回答

6

不要试图模拟 XDocument。问题不在这里,而是访问文件系统很麻烦。你可以传递一个Stream来写入清单:

public static void GenerateManifestFile(Stream output) {
  var doc = new XDocument();
  ...
  ... xml stuff added to doc
  ...
  doc.Save(output);
}

然后你可以使用 MemoryStream 进行测试,但实际上应该使用 FileStream 来访问清单路径。你甚至可以将此方法设置为内部 (使用 [InternalsVisibleTo] 以便你仍然可以从测试中访问它),并提供一个公共的无参数重载方法,如下所示:

using (Stream output = File.OpenWrite(manifestFilePath))
{
    GenerateManifestFile(output);
}

你不需要测试那段代码,但你可以测试所有真正有逻辑的部分。

+1:在公共方法中将其拆分为“using”部分和内部工作人员是一个非常好的提示。 - k.m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接