如何模拟调用invokation块的类?

时间:2013-02-18 11:00:58

标签: objective-c tdd fmdb ocmock invocation

我正在使用SenTestingKit和OCMock挖掘TDD和startet。我正在使用FMDB作为我的SQLite数据库的包装器。

我无法理解如何模拟DatabaseQueue类,因此它正确地使用FMDatabase对象调用调用块。

有什么想法吗?

CustomerFactory.h

@interface CustomerFactory

// DatabaseQueue inherits from FMDatabaseQueue
@property (nonatomic, retain) DatabaseQueue *queue;

- (id)initWithDatabaseQueue:(DatabaseQueue *)queue;

@end

CustomerFactory.m

@implement CustomerFactory

- (id)initWithDatabaseQueue:(DatabaseQueue *)queue
{
    if ((self = [super init]))
    {
        [self setQueue:queue];
    }
}

- (NSArray *)customersByCategory:(NSUInteger)categoryId
{
    __block NSMutableArray *temp = [[NSMutableArray alloc] init];

    [self.queue inDatabase:^(FMDatabase *db)
    {
        FMResultSet *result = [db executeQuery:@"SELECT * FROM customers WHERE category_id = ?", categoryId];

        while ([result next])
        {
            Customer *customer = [[Customer alloc] initWithDictionary:[result resultDictionary]];
            [temp addObject:customer;
        }
    }];

    return temp;
}

@end

1 个答案:

答案 0 :(得分:1)

如果您正在测试 CustomerFactory 类,那么您根本不应该这样做。将其视为测试我们单元的界面,这是一个 CustomerFactory 实例。您有一个名为 customersByCategory:的方法,您只对通过此调用获取客户对象的NSArray感兴趣。您在其中使用 DatabaseQueue FMDatabase 实例的事实是实施细节,该细节对于此特定单元测试应该是透明的。

测试 DatabaseQueue 类是一个不同的故事,但看起来最简单的方法是在测试中使用 DatabaseQueue 的实际实例