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

本文关键字:模拟 对象 静态方法 | 更新日期: 2023-09-27 18:31:37

如果我有这样的东西:

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

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

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

不要试图嘲笑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);
}

然后,您不会测试代码,但可以测试所有实际逻辑。