C# 模拟静态类

C# 模拟静态类,c#,unit-testing,mocking,xunit,nsubstitute,C#,Unit Testing,Mocking,Xunit,Nsubstitute,我试图用NSubstitute模拟C#中的静态类和静态方法。我显然不想为每个单元测试生成一个excel文件。所以我一定要嘲笑。但由于这是一个静态类,我无法模拟,因为这是一个静态类 public static class FileGenerator { public static async Task GenerateExcelFile(string filename, IEnumerable<T> content) { ..... } }

我试图用NSubstitute模拟C#中的静态类和静态方法。我显然不想为每个单元测试生成一个excel文件。所以我一定要嘲笑。但由于这是一个静态类,我无法模拟,因为这是一个静态类

public static class FileGenerator 
{
    public static async Task GenerateExcelFile(string filename, IEnumerable<T> content) 
    {
        .....
    }
}

var mockobj =  Substitute.For<FileGenerator>(); // Returns error
公共静态类文件生成器
{
公共静态异步任务GenerateExcelFile(字符串文件名,IEnumerable内容)
{
.....
}
}
var mockobj=Substitute.For();//返回错误

有什么提示吗?

最好只少量使用static。这是一种很容易被误用为捷径的机制。但这些最终总是会引发问题

对于常量或运行时常量,可以使用静态变量。但不要将其用于更改数据。一种叫做
文件生成器的东西
?就在那里,你不应该制造静电

相反:

  • 创建一个需要实例化的普通类
  • 创建实例并将其指定给静态字段

现在,您可以轻松地并行使用多个实例。您还可以提取接口/抽象类,然后创建不同的实现。包括模拟实现。

我无法模拟,因为这是一个静态类-这是一个答案-不要使用静态。NSubstitute无法模拟静态类(请参阅;它需要能够子类化或实现接口)@克里斯托弗的回答有一些不错的选择。