如何使用xunit C#测试私有方法。

4

我正在使用xUnit对C#代码进行测试。

我遇到了一个问题,当我测试一个私有方法时,它不能工作,因为该方法不是公共的(其他类无法访问此方法)。

我有一个类,其中包含一个私有方法:

public class Calculator{
    //...
    private double DegreeToRadian(double angle)
    {
        return Math.PI * angle / 180.0;
    }
    //...
}

在测试中:

public class TestCalculator{

    [Fact]
    public void ConvertDegreeToRadian()
    {
        // Arrange
        Calculator _calculator = new Calculator();
    
        // Act
        double angle = 90;
        double expected = angle * Math.PI / 180;
        double result = _calculator.DegreeToRadian(angle);
    
        // Assert
        Assert.Equal(expected, result);

    }
}

有没有办法在私有方法中进行测试?


2
这通常是不建议的,这就是为什么它不容易做到。你要么需要使用反射来调用它,要么以某种方式使其可用,通常是通过将其公开。为什么需要测试它?因为它是私有的,是实现细节。 - Lasse V. Karlsen
2
在我看来,如果你的老师教你测试私有方法,他要么是想教你这很痛苦,要么是想教你反射很痛苦,要么就是教错了。不能轻易地测试私有方法是有原因的,它被推荐避免,大多数人都试图避免这样做。(是的,有时必须这样做,但跟从着火建筑物上跳下来一样,这不是你想养成的习惯) - Lasse V. Karlsen
更重要的问题是,为什么一个计算器首先需要一个将角度转换为弧度的“私有”函数。即使是我从沃尔玛购买的1美元计算器也允许我这样做。 - user585968
@TechInquisitor 好的。 - NobodyKnowsAboutMe
这个 Calculator 类有一个公共方法,它使用一些私有方法,例如 double DegreeToRadian(double angle)。如果私有方法是由公共方法间接调用的,则无需直接测试前者。如果您发现有私有方法从未被公共方法调用,则可能存在设计问题,可能涉及孤立的代码。 - user585968
显示剩余4条评论
1个回答

4

你应该测试所有代码,但私有方法是隐式测试的。

也就是说,你的代码以某种方式影响了某些公共方法的输出。

如果它没有影响,则永远不会被执行。如果它确实有影响,则通过调用公共方法并针对受私有方法影响的输出进行测试来进行测试。

唯一的例外是测试内部类,因为它是一种中间可见性选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接