我使用NUnit对C#中的私有方法进行单元测试.
例如,我的方法(如果是公共的)应该抛出一个ArgumentNullException.我可以声明该方法抛出ArgumentNullException如此:Assert.Throws<ArgumentNullException>(() => method.Call());
但是,因为我使用反射调用私有方法,所以我会断言一个TargetInvocationException抛出ArgumentNullException类似的方法:Assert.Throws<TargetInvocationException>(() => methodInfo.Invoke(obj, new object[] { params }));
我想声明一个ArgumentNullException而不是一个TargetInvocationException私有方法,所以我可以扫描它的代码,知道它的预期做什么而不是调试找出来.
我如何断言实际的异常,而不是TargetInvocationException?
注意:这个问题并没有解决单元测试公共与私有方法背后的理论.我和我的团队决定对私有方法进行单元测试,这是否是单元测试的方式与这个问题无关.请参阅此问题上最受欢迎的答案,以了解我们的理由.
随着我继续在C#中进一步增强我的刽子手游戏以帮助我学习语言并像程序员一样思考,我认为其中的方法应该在不同的课程中.现在,所有代码都在Form类(Windows窗体)上.这使得调用所需的方法非常简单,因为我只需要使用方法名称并使用必要的参数.而且,由于它只是一个简单的刽子手游戏,这可能是最好的方法.我不知道.
具体来说,我之一的方法是读取一个包含数千个单词的.txt文件,将其拆分为数组,对数组进行洗牌,然后调用另一个方法来执行其他操作.
当我阅读一些关于C#的文献时,我被告知你想尽可能多地隐藏你的课程.这样你就不能通过传递它无法处理的数据来破坏你的类.但这似乎意味着我必须向该类添加一个属性才能访问它,除了必须创建该类的对象,只是为了能够使用我想要的方法.这似乎是一种拜占庭式的方式来访问该方法.
正如有经验的程序员所看到的那样,我不是在想程序员.我的重点是尽早养成正确的习惯,而不是在以后消除坏习惯.
所以问题基本上是这个方法应该在这样的简单程序中设置为私有吗?什么是最佳做法?
有问题的代码如下(读取文件的方法,表格数组,随机播放等):
private void ReadFile(StringBuilder hintlength, string[] wordlist, string lettercountpath)
{
string fileContent = File.ReadAllText(lettercountpath); //Read file
string[] array = fileContent.Split((string[]null, StringSplitOptions.RemoveEmptyEntries); //Form array
Random rand = new Random();
for (int i = 0; i < array.Length; i++) // Shuffle algorithm
{
int randIndex = rand.Next(i, array.Lenth);
string temp = array[randIndex];
array[randIndex] = array[i];
array[i] = temp;
}
for (int i = 0; i < 10; i++0) //Assigns shuffled array into wordlist array
wordlist[] = array[i]; …Run Code Online (Sandbox Code Playgroud) 在2017年的cppcon视频中,我遇到了Klaus Iglberger的一个名为" Free Your Functions! " 的演讲.在这次演讲中,演讲者谈到了如何切换到自由函数可以简化测试私有方法的过程(参见19:00).这个想法是你将私有方法拉出类(你使它成为一个自由函数),它变得可测试.
起初,我觉得这个想法很有意思,但是我想的越多,我就越不了解这实际上应该如何工作.例如,假设我有以下(虚拟)类:
class SomeClass
{
public:
SomeClass();
~SomeClass();
void someTask();
private:
void someComplexTask();
void someOtherComplexTask();
};
void SomeClass::someTask()
{
someComplexTask();
someOtherComplexTask();
}
// private tasks implementations...
Run Code Online (Sandbox Code Playgroud)
然后someComplexTask()和someOtherComplexTask()是私有方法.这意味着它们是实现细节,即它们只能在内部SomeClass(或朋友)调用.在我看来,如果你让它们成为自由函数,是的它们变得可测试,但它们不再是私有的,也不仅仅是特定的实现细节SomeClass.实际上,它们可以从代码中的任何地方调用......
所以我的问题是:为什么Iglberger先生的观点有效?
以下是Objective-C中私有方法的示例:
MyClass.m
#import "MyClass.h"
@interface MyClass (Private)
-(void) privateMethod:(NSString *)arg1 and: (NSString*)arg2;
@end
@implementation MyClass
-(void) publicMethod {
NSLog(@"public method\n");
/*call privateMethod with arg1, and arg2 ??? */
}
-(void) privateMethod:(NSString *)arg1 and: (NSString*)arg2{
NSLog(@"Arg1 %@ and Arg2 %@", arg1, arg2);
}
@end
Run Code Online (Sandbox Code Playgroud)
我读过有关私有接口/方法声明的内容.但是如何从其他公共方法调用它们?我试过了,[self privateMethod:@"Foo" and: @"Bar"]但看起来不对.
可能重复:
在类中创建私有构造函数有什么用?
何时使用私有构造函数有用?那受保护的呢?
我定义了以下代码(在Scala IDE/Scala工作表中使用Scala 2.10):
object WorkSheet1 {
object A {
def apply(s: String, huh: Boolean = false): A = A(s)
}
case class A (s: String)
//case class A private (s: String)
val a = A("Oh, Hai")
}
Run Code Online (Sandbox Code Playgroud)
我成功收到以下输出:
a:public_domain.WorkSheet1.A = A(哦,海)
但是,当我注释掉现有的case class A (s: String)并取消注释掉另一个(包含" private ")时,我收到以下编译器错误:"在对象WorkSheet1中无法访问类A中的构造函数A".
我的理解是,一个伴侣对象可以访问它所有的伴侣类的私有部分.嘿.呃......说真的.是什么赋予了?
我有一个私有静态方法的主类.我想从另一个java类访问此方法.我试过一些方法,但是他们没有用.我该如何访问该方法?
像这样的主要班级;
public class RandomGenerate {
public static void main(String[] args) throws Exception {
System.out.print.ln("main method");
}
private static synchronized void createRandom(PersonObj person, int number, List s) {
System.out.println("deneme");
}
}
Run Code Online (Sandbox Code Playgroud)
我想createRandom从另一个像这样的java类调用;
public class Deneme {
RandomGenerate rg = new RandomGenerate();
RandomGenerate.createRandom(person, number, sList);
}
Run Code Online (Sandbox Code Playgroud)
然后,netbeans显示方法具有私有访问权限.
public void publicMethod() {
for (i=1;i<10;i++)
privateMethod();
}
private privateMethod() {
something...
}
Run Code Online (Sandbox Code Playgroud)
我需要编写一个JUnit测试用例来验证privateMethod()调用的次数.
当我看到以下代码时,我在神话般的python-chess库的源代码中徘徊:
def _reset_board(self):
# code...
def reset_board(self):
self._reset_board()
Run Code Online (Sandbox Code Playgroud)
该reset_board()函数只做一件事,调用它的私有对应物.这背后有原因吗?不会将代码直接放在私有函数中更快,因为python不必解析名称_reset_board()?
我正在我的 Rails 控制台中重现一个错误。我对某些方法返回的内容感兴趣,但其中一些方法结果是私有的,所以在我的控制台中我必须编写:
\n> my_object.my_method\nNoMethodError (private method `my_method' called for #<MyClass:0x0123456789ABCDEF>)\n> my_object.send(:my_method)\nRun Code Online (Sandbox Code Playgroud)\n一段时间后,这会变得有点乏味,特别是因为如果不深入到它们定义的类,就不清楚哪些是私有的。
\n有什么办法可以暂时公开所有方法吗?我不打算在生产中使用它,只是在调试时暂时在本地控制台中使用它。
\n更新:当我说 \xe2\x80\x9call 方法\xe2\x80\x9d 时,我不\xe2\x80\x99t 只是指my_object. 我的意思是字面上每个对象上的所有方法。
private-methods ×10
java ×3
c# ×2
constructor ×2
assert ×1
c++ ×1
class-design ×1
debugging ×1
exception ×1
function ×1
junit ×1
mockito ×1
nunit ×1
objective-c ×1
python ×1
python-chess ×1
ruby ×1
scala ×1
unit-testing ×1