静态方法的调用是单元测试的测试用例吗?

时间:2017-06-12 17:21:24

标签: c# unit-testing moq

这是我班级的简化模型。

public static FooFactory
{
    public void CreateFooByUrl(string url) 
    {
        try 
        {
           // business logic
        }
        catch(Exception exc) 
        {
           ApplicationLogger.LogError(exc);
        }
    }
}

ApplicationLogger是一个在整个解决方案中使用的静态类。如何验证是否记录了错误?

这是我测试方法的一个例子。

[TestMethod]
public void CreateFooExpectedError()
{
    // Arrange
    string testUrl = "fakeUrl";

    // Act
    FooFactory.CreateFoo(testUrl);

    // Assert
    /ApplicationLogger.LogError();
}

如何检查调用了LogError方法?它是测试用例吗?

1 个答案:

答案 0 :(得分:4)

您对ApplicationLogger有很强的依赖性。这不好。现在你无法测试CreateFooByUrl在没有实际记录内容的情况下工作。相反,让它使用IApplicationLogger(接口),然后您可以提供该接口的模拟实现作为单元测试的一部分。这可能意味着你需要使FooFactory非静态(你不能在静态类中使用非静态方法,如你所示)或更改CreateFooByUrl以接受{{1作为参数(杂乱无章)。

这是干净的方式:

IApplicationLogger

从“关注点分离”的角度来看,情况要好得多。为什么FooFactory应该如何记录事情?它只需要能够记录事物。这就是为什么最好对接口进行编码。然后,如果您想要切换日志记录实现,您只需创建一个实现IApplicationLogger的新类,一切都将神奇地工作。