gpt4 book ai didi

ios - OCMock单元测试错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:42:27 25 4
gpt4 key购买 nike

我使用 OCMock 来测试单例方法。我得到“模拟类中不存在这样的方法”。 testSingletonWithBlock 方法的 testSingleton 方法错误和无限循环(屏幕截图,旋转指示器)

编辑:在这里下载示例项目

https://drive.google.com/file/d/0B-iP0P7UfFj0LVFpWWpPb3RDZFU/edit?usp=sharing

enter image description here

这是我的实现

经理:

@implementation Manager
+ (Manager *)sharedManager {
static Manager *instance;
dispatch_once_t predicate;
dispatch_once(&predicate, ^{
instance = [Manager new];
});
return instance;
}
- (int)getOne {
return 1;
}
- (void)success:(BOOL)success completion:(void(^)(void))completion failure:(void(^)(void))failure {
success ? completion() : failure();
}

View Controller :

- (void)manager_printOne {
int num = [[Manager sharedManager] getOne];
NSLog(@"number is: %d", num);
}

- (void)manager_success:(BOOL)success completion:(void(^)(void))completion failure:(void(^)(void))failure {

[[Manager sharedManager] success:success completion:completion failure:failure];

}

测试 View Controller :

@interface coreDataTestTests : XCTestCase

@property (nonatomic, strong) id mockManager;

@property (nonatomic, strong) ViewController *viewController;

@end

@implementation coreDataTestTests

- (void)setUp
{
[super setUp];

self.viewController = [ViewController new];

//for singleton
self.mockManager = [Manager createNiceMockManager];
}

- (void)tearDown
{
[super tearDown];

self.viewController = nil;


//Note: singleton need both, retain counts = 2
self.mockManager = nil;
[Manager releaseInstance];

}



- (void)testSingleton {

NSLog(@"testSingleton");
OCMStub([self.mockManager getOne]).andReturn(2);
[self.viewController manager_printOne];

}



- (void)testSingletonWithBlock {

NSLog(@"testSingletonWithBlock");

[[[[self.mockHelper stub] ignoringNonObjectArgs] andDo:^(NSInvocation *invocation) {

void(^block)(void);

[invocation getArgument:&block atIndex:3];
block();

}] success:0 completion:[OCMArg any] failure:[OCMArg any]];


[self.viewController manager_success:NO completion:^{
NSLog(@"completion");
} failure:^{
NSLog(@"failure");
}];



}




@end

单元测试的管理器类别:

static Manager *mockManager = nil;

@implementation Manager

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

+ (Manager *)sharedManager {
if (mockManager) {
return mockManager;
}
return invokeSupersequentNoParameters();
}



#pragma clang diagnostic pop

+(id)createMockManager {
mockManager = [OCMockObject mockForClass:[Manager class]];
return mockManager;
}

+(id)createNiceMockManager {
mockManager = [OCMockObject niceMockForClass:[Manager class]];
return mockManager;
}

+(void)releaseInstance {
mockManager = nil;
}

最佳答案

无需创建类别,您可以 stub sharedManager 并返回一个漂亮的模拟。

- (void)setUp
{
[super setUp];

self.viewController = [ViewController new];

//for singleton
id classMockManager = OCClassMock([Manager class]);
OCMStub([classMockManager sharedManager]).andReturn(classMockManager);
self.mockManager = classMockManager;
}

目前我还没有测试这个的环境,但这个策略应该有效。请注意,这是 OCMock3 语法。参见 http://ocmock.org/reference/#mocking-class-methods

关于ios - OCMock单元测试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25588215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com