繁体   English   中英

如何使用OCMock模拟服务

[英]How to use OCMock to mock a service

我正在尝试编写一个用于创建具有以下定义的属性的checklistItem的单元测试:

typedef NS_ENUM (NSUInteger, ChecklistStatus) { Pending, Completed };
@protocol IChecklistItem <NSObject>
@property (nonatomic, assign, readonly) NSInteger Id;
@property (nonatomic, copy, readonly) NSString *Description;
@property (nonatomic, assign, readonly)BOOL IsCompleted;
@property (nonatomic, assign, readwrite) ChecklistStatus Status;
@property (nonatomic, strong, readwrite) NSDate *CompletedDate;
@property (nonatomic, copy, readwrite) NSString *CompletedByUserId;
@property (nonatomic, assign, readonly) NSInteger RoleId;
@property (nonatomic, assign, readonly) NSInteger GroupId;
@property (nonatomic, strong, readonly) NSArray<IChecklistNote> *Notes;

现在,我在XCTest的设置方法中有了此设置:

_service = [[ChecklistService alloc]initWithUrl:[NSURL URLWithString:kcChecklistUrl] credentialsManager:self.credentialsManager];

这是我的单元测试的其余部分:

- (void)testCreateChecklistItem {
    XCTAssertNotNil(_service);
    CCChecklistItem *checklistItem = [CCChecklistItem new];
    CCChecklistItem *newChecklistItem = [CCChecklistItem new];
    newChecklistItem.Id = 2;
    newChecklistItem.Description = @"This is the Description";
    newChecklistItem.RoleId = 2;
    newChecklistItem.GroupId = 3;
    newChecklistItem.Notes = nil;
    newChecklistItem.Status = Completed;

    XCTestExpectation *checklistItemExpectation = [self expectationWithDescription:@"checklistItem"];

    id delegate = OCMProtocolMock(@protocol(ChecklistServiceDelegate));
    id mock = [OCMockObject mockForProtocol:(@protocol(IChecklistService))];
    [[[mock stub] andReturn:newChecklistItem] createChecklistItem:checklistItem delegate:delegate];

    OCMExpect(([delegate didCompleteCreateChecklistItem:[OCMArg checkWithBlock:^BOOL(id obj) {
        CCChecklistItem *items = obj;
        XCTAssertNotNil(items);
        double checklistId = items.Id;
        XCTAssert(checklistId != 0);
        [checklistItemExpectation fulfill];
    }]]));

    [_service createChecklistItem:checklistItem delegate:delegate];
    [self waitForExpectationsWithTimeout:5 handler:^(NSError *error) {
        if(error) {
        }
        OCMVerifyAll(delegate);
    }];
}

但是,我得到的错误failed: caught "NSUnknownKeyException", "[<__NSCFString 0x7faeaad6bd60> valueForUndefinedKey:]: this class is not key value coding-compliant for the key CompletedBy."

createChecklistItem定义如下:

- (void)createChecklistItem:(id<IChecklistItem>)checklistItem delegate:(NSObject<ChecklistServiceDelegate> *)delegate
{
    NSMutableArray *mockChecklistItem = [NSMutableArray new];
    [TestObjectLoader loadObject:mockChecklistItem
                    fromJSONFile:@"ChecklistItem"
                     withMapping:[MappingProvider checklistCreateMapping]];
    if (delegate != nil && [delegate respondsToSelector:@selector (didCompleteCreateChecklistItem:)]) {
        [delegate didCompleteCreateChecklistItem:(NSObject<IChecklistItem> *)mockChecklistItem];
    }
}

Checklist.json在哪里

{
    "Id": 13,
    "Desc": "Checklist Description",
    "IsCompleted": "false",
    "TypeId": 1,
    "RoleId": 1,
    "Status": "C",
    "CompletedDateTime": "2015-06-23T00:00:00+00:00",
    "CompletedBy": "AC",
    "Notes": [
              {
              "Note": "test",
              "CreatedBy": "AC",
              "CreatedDateTime": "2015-06-23T00:00:00+00:00"
              }
              ]
}

基本上,我想模拟服务,当调用createChecklistItem时,我只想在对象上设置一个随机Id并将其传递回去,而不是通过Json文件中的ChecklistService读取它。 反正有这样做吗? 我在测试中加入了模拟,但是我不相信我在正确使用它。

实际上,您实际上不需要Checklist.json ,而应该只返回具有不同ID的值。

所以...

- (void)createChecklistItem:(id<IChecklistItem>)checklistItem delegate:(NSObject<ChecklistServiceDelegate> *)delegate
{
    NSMutableArray *mockChecklistItem = [NSMutableArray new];
    [TestObjectLoader loadObject:mockChecklistItem
                    fromJSONFile:@"ChecklistItem"
                     withMapping:[MappingProvider checklistCreateMapping]];
    if (delegate != nil && [delegate respondsToSelector:@selector (didCompleteCreateChecklistItem:)]) {
        [delegate didCompleteCreateChecklistItem:(NSObject<IChecklistItem> *)mockChecklistItem];
    }
}

应该只是

checklistItem.Id = 2; //Random number

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM