假设我有一个如下所示的类,我想对'DoCalculate(arg1,arg2)'函数进行单元测试:
public class Calc
{
public int DoCalculate(int arg1, int arg2)
{
int num1 = this.GetNum1(); // member function
int num2 = this.GetNum2(); // member function
if( this.flag1) // member variable
{
return num1*num2+arg1-arg2;
}
else
{
int num3 = this.GetNum3(); // member function
return num3 + arg2;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在此函数中,它从其他成员函数和成员变量获取输入.
如何对这个功能进行单元测试?或者如何重构以使其可单元测试?
我认为这里有几个选择.
解决方案可能取决于您的功能GetNum*()实际执行的内容.
单元测试是两件事之一,你想要什么,
看起来你的测试是第一种类型.因此,为了使您的测试有用,您需要让您的类进入已知状态,以便GetNum*()函数(和您的标志)在调用时返回预期值.
GetNum*()调用函数时知道它们将返回什么(即可以通过设置属性或调用类的其他方法来完成)GetNum*()函数做一些非确定性的事情(比如调用Web服务或从数据库加载某些东西).如果您处于第一种情况,那么很好,只需调用必要的方法/属性来创建您需要的状态,然后调用您的函数并断言结果.
如果您处于第二种情况,那么您需要考虑将您的类分开,并将执行外部调用的位转换为一个单独的类(实现定义两个类之间的契约的接口),此类具有依赖性.然后,您可以通过其构造函数将新接口的实例传递到此类(或者可能传入您正在调用的方法,但可能是构造函数),然后在测试中传递一个模拟,该模拟提供了您需要能够测试的值.方法快速可靠.
| 归档时间: |
|
| 查看次数: |
1197 次 |
| 最近记录: |