我在ClassA中有这两个方法
-(IBAction)onSubmit;
-(void)validateName:(NSString*)name;@实现
- (IBAction)onSubmit {
[self validateName:self.textfield.text];
}
-(void)validateName:(NSString*)name{
// do something
}我的测试如下所示:
//given
ClassA *classA = mock([ClassA class]);
classA.textfield.text = @"Foo";
// when
[classA onSubmit];
[verify(classA) validateName:@"Foo"];但这并不管用,我一直收到:
Expected 1 matching invocation, but received 0当调用onSubmit时,我如何编写一个测试来验证validateName是否已执行。
发布于 2013-04-06 21:35:59
正确的单元测试测试内部状态和外部行为。你的单元测试测试的是你的代码是否做了什么,而不是它是如何做的。状态验证告诉您预期的结果已经达到,而行为验证则告诉您协作对象与被测系统正确对接。这让你可以做一些很棒的事情,比如重构。
内部状态的测试是这样的:
给定初始状态,如果被测系统做了一些事情,那么结果状态应该是这样的。
外部行为的测试是这样的:
如果被测系统做了一些事情,那么另一个单元应该做其他事情。
第一类测试是通过标准断言(OCHamcrest中的assertThat()调用)完成的。第二类测试(正确地)通过验证测试对(在OCMockito的情况下是verify()调用)完成。
模拟被测系统是没有任何意义的。如果您发现有必要测试内部行为(即被测试系统调用的特定方法),那么您需要将这些行为映射到状态。在您的例子中,这意味着ClassA实现了一个标志,如BOOL_nameValidated(最好使用getter isNameValidated)或一个变量,如NSString_*validatedName。
https://stackoverflow.com/questions/15690600
复制相似问题