如果方法仅更改私有成员并返回它,如何进行单元测试

时间:2015-07-08 07:19:02

标签: c# .net unit-testing

请看下面我的情景,

#include<stdio.h>
double myAtoi(char *str);
void main()
{
    double n;
    double m;
    char* a="12345678912";
    char* b="34";
    n=myAtoi(a);
    //m=atoi(b);
    printf("\nconversion is : %d",(n));
}

double myAtoi(char *str)
{   
    printf("\nstr : %s",str);
    long res = 0; // Initialize result
    long i ;
    // Iterate through all characters of input string and update result
    for (i = 0; str[i] != '\0'; ++i)
    {
        res = res*10 + str[i] - '0';
        printf("\n res : %d",res);
        //x=res;
    }
    return res;
}

我不确定对这种方法进行单元测试的最佳方法。也许我可以使用反射,但我不认为这是一种明智的方式。有人有想法吗?

1 个答案:

答案 0 :(得分:0)

想想你真正对测试感兴趣的是什么。对于GetExpectedTech方法,您传入一个字符串并返回Tech。可能是传入的字符串与返回的Tech之间存在某种联系。这就是你应该测试的东西(可能不是null,包含期望值等)。

如果方法的副作用是Tech存储在类的字段中,那么你必须出于某种原因(如果不是你不应该这样做)。目前在您发布的代码中没有理由,但最可能的原因似乎是类中有其他方法使用Tech或返回它。在这一点上,您可以链接这两种方法,以创建两种方法之间的关系。如果方法之间的关系是您尝试测试的一部分,那么在SUT上调用多个方法没有任何问题,所以你可以这样做:

var expectedTech = sut.GetExpectedTech(someString);
var otherTech = sut.DoSomethingElse(someOtherParams);
Assert.AreEqual(expectedTech, otherTech);

如果它是你需要为其他方法测试的Tech的交互,那么你可能需要查看创建模式,这样你就可以将一个Mock注入你的SUT,但不知道还有什么你的班级很难说这是否有必要。

正如您所说,您可以使用反射访问该成员,或PrivateObject但是,这是正确的事情的场景数量相对较少,所以如果您需要这样做,它可以表明你的班级需要重构。