iOS OCMock部分模拟与类模拟
我正在学习iOS测试的OCMock。“类模拟”和“部分模拟”之间有什么区别?什么时候应该使用其中一种iOS OCMock部分模拟与类模拟,ios,ocmock,Ios,Ocmock,我正在学习iOS测试的OCMock。“类模拟”和“部分模拟”之间有什么区别?什么时候应该使用其中一种 类模拟创建纯类实例模拟的对象 部分模拟获取一个类的实例,并允许您存根它的任何方法 假设我有这些课程: @interface Foo : NSObject - (void)doX; @end @implementation - (void)doX { NSLog(@"X"); } @end @interface Bar : NSObject - (void)doA:(Foo *)foo;
类模拟
创建纯类实例模拟的对象
部分模拟
获取一个类的实例,并允许您存根它的任何方法
假设我有这些课程:
@interface Foo : NSObject
- (void)doX;
@end
@implementation
- (void)doX
{
NSLog(@"X");
}
@end
@interface Bar : NSObject
- (void)doA:(Foo *)foo;
- (void)doB;
@end
@implementation Bar
- (void)doA:(Foo *)foo
{
NSLog(@"A");
[foo doX];
[self doB];
}
- (void)doB
{
NSLog(@"B");
}
@end
我对测试Bar的doA:
方法感兴趣。我希望它在Foo
对象上调用doX
,然后调用自己的doB
方法。我将使用Foo的类模拟和Bar的部分模拟来实现这一点
- (void)test_doA_shouldCall_doX_and_doB
{
id objectUnderTest = [OCMockObject partialMockForObject:[Bar new]];
id fooMock = [OCMockObject mockForClass:Foo.class];
[[fooMock expect] doX];
[[objectUnderTest expect] doB];
// Make the call
[objectUnderTest doA:fooMock];
[objectUnderTest verify];
[fooMock verify];
}
您可以在这里看到,我的部分模拟允许我调用我想要测试的真实方法,同时模拟对其另一个实例方法的内部调用。因为我不需要Foo的任何真正功能,所以我使用了一个类模拟。感谢您提供了非常有用的答案。我有两个后续问题:1)纯模拟不允许调用任何真正的方法,这是真的吗?2) 为什么不能创建Foo的部分模拟,然后对doX方法执行expect呢。纯模拟不受真实对象的支持,但从技术上讲,您可以通过使用
和调用或和执行来设置任何模拟以调用任何方法——部分模拟允许您执行和转发对象。2.您可以创建Foo的部分模拟——有时创建对象会产生副作用或涉及与测试无关的工作。此外,当调用意外的方法时,不是好的模拟的纯模拟会抱怨,而部分模拟则不会。