Nunit测试-测试公共方法调用的私有方法代码的一部分

Nunit测试-测试公共方法调用的私有方法代码的一部分,nunit,private-methods,Nunit,Private Methods,我正在尝试用私有方法(方法a)测试一段代码。在流中,此私有方法由公共方法调用。 为了在方法A中测试此代码,它从另一个私有方法(方法B)返回数据 如何测试这段代码?私有方法只是实现细节,因此所有功能都应该通过公共接口进行测试。在你的案例中,通过“我的测试”方法。安德烈亚斯尼科的回答是测试哲学的陈述——我经常同意这一点。但问题是如何解决的,所以我会这样回答,然后回到哲学部分 显然,如果你的方法是私有的,你不能调用它(除了通过反射,在我看来这有点傻)。最简单的方法是将其公开,并在其前面粘贴一条评论,上

我正在尝试用私有方法(方法a)测试一段代码。在流中,此私有方法由公共方法调用。 为了在方法A中测试此代码,它从另一个私有方法(方法B)返回数据


如何测试这段代码?

私有方法只是实现细节,因此所有功能都应该通过公共接口进行测试。在你的案例中,通过“我的测试”方法。

安德烈亚斯尼科的回答是测试哲学的陈述——我经常同意这一点。但问题是如何解决的,所以我会这样回答,然后回到哲学部分

显然,如果你的方法是私有的,你不能调用它(除了通过反射,在我看来这有点傻)。最简单的方法是将其公开,并在其前面粘贴一条评论,上面写着“仅用于测试的公开!”您的编码标准或面向对象的观点,可能会告诉您不要这样做,但请记住,一些早期的单元测试框架是使用没有可见性修饰符的语言开发的,没有可见性修饰符也可以很好地进行。对于一般(非金融)商业应用程序,我认为这样做没有坏处

第二种最简单的方法是使方法内部化,并使内部对测试程序集可见。对于NUnit自己的测试,这就是我们现在正在做的,尽管我们有很多使用第一种方法的遗留代码

这不是一个讨论白盒单元测试和黑盒单元测试的好地方。NUnit(和其他框架)最初是由测试其设计的实现的开发人员创建的。所以测试直接进入了肮脏的细节。如果你是开发人员,而不是测试人员,那么做这种测试没有错。事实上,如果你想在尽可能小的步骤中进行TDD,那就是你必须要做的。在我看来,重要的是,你随时都知道自己在做什么。一个好的测试套件通常会有两种测试。

您的代码示例过于通用,不容易回答。显而易见的答案是通过“MyTest”方法进行测试。如果这是您的问题,那么还不清楚为什么不起作用。Thid methodB执行完整的业务逻辑。有没有可能模仿methodBThanks!安德烈亚斯尼科在这上面加了1分。另一个解决方案可能是将methodB提取到它自己的类中,因为它似乎做了其他类之外的事情(我在这里猜测)。然后你可以用惯常的方式模仿你的依赖关系。
public returntype MyTest()
{
  this.methodA();
}

private returntype methodA()
{
 rep = this.methodB(some paramethers);
// code to be tested using rep
}

private returntype methodB()
{
//some code
}