我正在使用SenTestingKit和OCMock挖掘TDD和startet。我正在使用FMDB作为我的SQLite数据库的包装器。
我无法理解如何模拟DatabaseQueue
类,因此它正确地使用FMDatabase
对象调用调用块。
有什么想法吗?
@interface CustomerFactory
// DatabaseQueue inherits from FMDatabaseQueue
@property (nonatomic, retain) DatabaseQueue *queue;
- (id)initWithDatabaseQueue:(DatabaseQueue *)queue;
@end
@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
答案 0 :(得分:1)
如果您正在测试 CustomerFactory 类,那么您根本不应该这样做。将其视为测试我们单元的界面,这是一个 CustomerFactory 实例。您有一个名为 customersByCategory:的方法,您只对通过此调用获取客户对象的NSArray感兴趣。您在其中使用 DatabaseQueue 和 FMDatabase 实例的事实是实施细节,该细节对于此特定单元测试应该是透明的。
测试 DatabaseQueue 类是一个不同的故事,但看起来最简单的方法是在测试中使用 DatabaseQueue 的实际实例