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

时间:2012-04-19 19:25:03

标签: c# unit-testing moq mstest

如果我有这样的话:

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

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

1 个答案:

答案 0 :(得分: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);
}

然后您不测试那个代码,但您可以测试所有真实的逻辑。