【问题标题】:How do you mock object in a static method你如何在静态方法中模拟对象
【发布时间】:2012-05-01 09:28:09
【问题描述】:

如果我有这样的事情:

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

现在你能告诉我如何创建一个单元测试来确保该方法生成正确的xml吗? 如何在不向方法调用添加额外参数的情况下模拟 XDocument(我使用的是 Moq)

【问题讨论】:

    标签: c# unit-testing moq mstest


    【解决方案1】:

    不要试图模拟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-part + internal worker 是非常好的提示。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 2011-05-02
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多