首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法对调用静态方法的方法进行单元测试,我如何重新设计此程序?

无法对调用静态方法的方法进行单元测试,我如何重新设计此程序?
EN

Stack Overflow用户
提问于 2018-06-27 03:09:47
回答 1查看 67关注 0票数 1

我有一个在整个程序中将日志写入文本文件的类。我认为将方法设置为static会是一个好主意,因为它只有几个方法,并且在程序的许多不同部分中被调用。此方法在程序开始时调用一次,以创建初始文件。

代码语言:javascript
复制
public static void CreateAuditLog()
{
    var fileName = Path.Combine(filePath, 
        $@"AuditFile{DateTime.Now:yyyy-MM-dd_hh-mm-ss-fff}.txt");

    writer = new StreamWriter(new FileStream(fileName,
        FileMode.CreateNew, FileAccess.Write));

    GetAuditLogFileSize();
}

然而,在编写单元测试时,我不知道你不能测试一个调用静态方法的方法。(来自代码库的示例方法)

代码语言:javascript
复制
public Decimal CalculateCurrentBalance
{
    get
    {
        var balance = TotalAmountBilled - TotalAmountPaid;
        Audit.Message(2, $"Balance: {balance} for: {Name}");
        return TotalAmountBilled - TotalAmountPaid;
    }
}

message方法有很多细节,所以我不会在这里全部发布,但基本上它接受一个数字和一条消息来记录到文本文件中。流编写器故意在CreateAuditLog()中保持打开状态,以便可以在许多不同的位置调用Message(),并将消息写入日志文件。

代码语言:javascript
复制
public static void Message(int auditLevel, string message)

我觉得我设计这个程序的方式很糟糕。有没有人对我如何重新设计这个有什么建议?如果不在程序中的每个其他类上创建我的日志记录类的实例,我不确定如何才能做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-27 03:15:37

不要在每个其他类中创建一个实例;注入一个实例。

这是单元测试的基础之一:依赖注入。类不会创建或直接访问它们的依赖项,它们被传递给要使用的依赖项。在这种情况下,如果您的Log类实现了ILogger (您编写的接口),那么您的类将如下所示:

代码语言:javascript
复制
public class MyInjectedClass
{
     private readonly ILogger logger;
     public MyInjectedClass(ILogger logger)
     {
        this.logger = logger;
     }

     public void SomeMethod()
     {
        logger.Message();
     }
}

当然,现在你必须到处传递一个ILogger实例,这是一个很大的麻烦。幸运的是,有很多像NInjectAutofac这样的库可以为您连接所有的依赖项。这将需要一些重构,但一旦完成,您只需将日志记录类注册为ILogger接口的单例,它将自动注入到每个将其作为依赖项的类中。

(如果您正在使用.NET核心,MS也有一个DI库)

界面可能如下所示:

代码语言:javascript
复制
public interface ILogger
{
     void Message(string msg);
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51049922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档