首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OCMockito验证方法调用

使用OCMockito验证方法调用
EN

Stack Overflow用户
提问于 2013-03-29 03:34:53
回答 1查看 1K关注 0票数 2

我在ClassA中有这两个方法

代码语言:javascript
复制
-(IBAction)onSubmit;
-(void)validateName:(NSString*)name;

@实现

代码语言:javascript
复制
- (IBAction)onSubmit {
    [self validateName:self.textfield.text];
}

-(void)validateName:(NSString*)name{
    // do something
}

我的测试如下所示:

代码语言:javascript
复制
//given
ClassA *classA = mock([ClassA class]);
classA.textfield.text = @"Foo";

// when 
[classA onSubmit];

[verify(classA) validateName:@"Foo"];

但这并不管用,我一直收到:

代码语言:javascript
复制
Expected 1 matching invocation, but received 0

当调用onSubmit时,我如何编写一个测试来验证validateName是否已执行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-06 21:35:59

正确的单元测试测试内部状态和外部行为。你的单元测试测试的是你的代码是否做了什么,而不是它是如何做的。状态验证告诉您预期的结果已经达到,而行为验证则告诉您协作对象与被测系统正确对接。这让你可以做一些很棒的事情,比如重构。

内部状态的测试是这样的:

给定初始状态,如果被测系统做了一些事情,那么结果状态应该是这样的。

外部行为的测试是这样的:

如果被测系统做了一些事情,那么另一个单元应该做其他事情。

第一类测试是通过标准断言(OCHamcrest中的assertThat()调用)完成的。第二类测试(正确地)通过验证测试对(在OCMockito的情况下是verify()调用)完成。

模拟被测系统是没有任何意义的。如果您发现有必要测试内部行为(即被测试系统调用的特定方法),那么您需要将这些行为映射到状态。在您的例子中,这意味着ClassA实现了一个标志,如BOOL_nameValidated(最好使用getter isNameValidated)或一个变量,如NSString_*validatedName。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15690600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档