2015-04-07 44 views
0

我有以下类别:OCMock:测试方法有一个NSDictionary参数被调用

@interface ReportsArchiver 

-(void)fileReport:(NSDictionary*)reports; 

@end 

@interface OfficeManager 

@property (nonatomic) ReportsArchiver* reportsArchiver; 
-(void) reportIncident:(NSString*)name description:(NSString*)description; 

@end 

使用OCMock我想测试调用[officeManager reportIncident:@"fire alarm" description: @"false fire alarm"]当再[officeManager.reportsArchiver fileReport]获取与字典@{@"name": @"fire alarm", @"description": @"false fire alarm"}调用。

到目前为止,我已经写了下面的代码,这样做:

OfficeManager* officeManager = [OfficeManager new]; 
id reportsArchiverMock = OCMClassMock([ReportsArchiver class]); 
officeManager.reportsArchiver = reportsArchiverMock; 
NSDictionary* expectedReportDictionary = @{@"name": @"fire alarm", @"description": @"false fire alarm"}; 

[officeManager reportIncident:@"fire alarm" description: @"false fire alarm"]; 

// This call will fail because it checks for object equality, not dictionary equality.  
OCMVerify([reportsArchiverMock fileReport:expectedReportDictionary]); 

我如何可以验证该[reportsArchiverMock fileReport:{(NSDictionary*)]被调用,相同的NSDictionary使用OCMock?

回答

1

从那时起,我通过Twitter从@wolffan和@catehstn得到了建议,这里是我找到的解决方案。

  1. 使用OCMExpect - 不像OCMVerifyOCMExpect正确比较NSDictionaries。这是我找到的最干净的解决方案。

    OfficeManager* officeManager = [OfficeManager new]; 
    id reportsArchiverMock = OCMClassMock([ReportsArchiver class]); 
    officeManager.reportsArchiver = reportsArchiverMock; 
    NSDictionary* expectedReportDictionary = @{@"name": @"fire alarm", @"description": @"false fire alarm"}; 
    
    OCMExpect([reportsArchiverMock fileReport:expectedReportDictionary]) 
    [officeManager reportIncident:@"fire alarm" description: @"false fire alarm"]; 
    
    OCMVerifyAll(reportsArchiverMock); 
    
  2. 使用OCMStub并检查回调中的参数。这是一个相当混乱的解决方案。

OfficeManager* officeManager = [OfficeManager new] 
id reportsArchiverMock = OCMClassMock([ReportsArchiver class]); 
officeManager.reportsArchiver = reportsArchiverMock; 
NSDictionary* expectedReportDictionary = @{@"name": @"fire alarm", @"description": @"false fire alarm"};    

void (^reportIncidentInvocation)(NSInvocation *) = ^(NSInvocation *invocation) { 
     __unsafe_unretained NSInvocationOperation *reportDictionary; 
     [invocation getArgument: &reportDictionary atIndex: 2]; 
     XCTAssertTrue([expectedPropertiesCollection isEqualToDictionary:(NSDictionary*)reportDictionary]); 
    }; 
OCMStub([officeManager reportIncident:[OCMArg any]]).andDo(reportIncidentInvocation); 

OCMVerify([reportsArchiverMock fileReport:expectedReportDictionary]); 
+1

这很奇怪。使用验证或预期应该没有区别。如果存在对象相等与字典相等的问题,那么这也应该与期望一起发生。 (我说这是OCMock的维护者。)你介意在Github上打开一个问题,最好对OCMock进行失败的单元测试吗? –

+0

感谢您的回复@ErikDoernenburg。我会尝试通过单元测试来重现这一点,并打开一个问题。 –

相关问题