c# - 你如何在静态方法中模拟对象

标签 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),而不向方法调用添加额外的参数

最佳答案

不要尝试模拟 XDocument。这不是这里的问题 - 令人讨厌的是对文件系统的访问。您可以传入 Stream 以将 list 写入:

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

然后您可以使用 MemoryStream 对其进行测试,但在现实中使用 FileStream 到 list 路径。您甚至可以将此方法设为内部方法(使用 [InternalsVisibleTo],这样您仍然可以从测试中访问它)和公共(public)无参数重载,如下所示:

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

然后您无需测试代码,但您可以测试所有真实逻辑。

关于c# - 你如何在静态方法中模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10235310/

相关文章:

java - spock 测试中的对象比较失败

c# - 如何使用 Moq 测试方法调用顺序

c# - 如何基于 DataTemplate 的 DataContext 对象创建 ViewModel?

c# - UWP 通知 Toast 已激活、更新和过期

c# - "access to disposed closure"在这里是什么意思?

c# - 使用 Moq 对继承层次结构进行单元测试

c# - 在实现中设置私有(private) Setter 的模拟 void 方法

c# - 从 paypal 沙箱中获取响应

node.js - 如何对扩展抽象类读取环境变量的类进行单元测试

PHPUnit:如何模拟私有(private)方法?