2013-05-15 27 views
14

Tôi chỉ tập luyện OCMock, Vấn đề tôi đang phải đối mặt ở đây làTrở CGRect từ phương pháp chế giễu treo

Tôi có một phương thức có tên foo trả về CGRect, phương pháp này được gọi là từ phương pháp khác callFoo.

-(CGRect)foo { 
    return CGRectMake(10, 10, 10, 10); 
} 
-(void)callFoo { 
    CGRect rect = [self foo]; 
    NSLog(@"%@",NSStringFromCGRect(rect)); 
} 

Kiểm tra đơn vị của tôi cho phương pháp callFoo bị tắt.

- (void)test__callFoo__invokesWithMockingFoo 
{ 
    ViewController *sut = [[ViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:sut]; 

    CGRect rect = CGRectMake(0, 0, 0, 0); 
    [[[master expect] andReturnValue:OCMOCK_VALUE(rect)] foo]; 
    [sut callFoo]; 
    [master verify]; 
} 

Khi test này chạy, tôi nhận được một tai nạn bất ngờ khi nó đạt đến CGRect rect = [self foo];
Tôi muốn biết lý do tại sao tai nạn này xảy ra nếu chúng ta quay trở lại CGRect từ mocked method và làm thế nào để giải quyết vụ tai nạn này.

Có thể ai giúp bạn giải quyết vấn đề này.

Xin cảm ơn trước.

P.S: Điều này làm việc tốt nếu tôi thay thế CGRect bằng NSValue. As shown below

-(NSValue *)foo { 
     return [NSValue valueWithCGRect:CGRectMake(10, 10, 10, 10)]; 
    } 
    -(void)callFoo { 
     CGRect rect = [[self foo] CGRectValue]; 
     NSLog(@"%@",NSStringFromCGRect(rect)); 
    } 

và trong trường hợp thử nghiệm của tôi,

NSValue *rect = [NSValue valueWithCGRect:CGRectMake(0, 0, 0, 0)]; 
[[[master expect] andReturn:rect] foo]; 

update:
này trông giống như vấn đề với bộ nhớ [nhưng tôi không chắc chắn, chỉ cần một đoán].

Phương thức giả định sẽ cho tôi cấu trúc đúng nếu tôi tạo cấu trúc với biến số 2 CGFloat, trong khi nó sẽ hỏng nếu tôi tạo cấu trúc với biến số 2 double hoặc biến 3 CGFloat.

Thú vị :)

+3

Điều này có vẻ là một lỗi trong OCMock.Nó kết thúc lên làm cho foo điểm để thực hiện một null trong một phần giả (bạn có thể đã thấy rằng nếu bạn gọi foo trực tiếp bạn có thể nhận được kiểm tra để vượt qua). Một (phải thừa nhận là không tuyệt vời) workaround sẽ được đặt foo trong một lớp khác nhau và giả lập đó. –

+0

Tôi không chắc chắn nó là một lỗi trong OCMock, nhưng khi tôi đã thử với cấu trúc tùy chỉnh tương tự như CGRect tức là. struct chứa hai cấu trúc (struct1 & struct2) chứa hai biến trong đó. Nhưng kết quả là như nhau, nó bị rơi. Nhưng nếu tôi structs tức là struct1 và struct2 chỉ chứa một biến trong nó sau đó kiểm tra sẽ vượt qua –

+1

Đây là một lỗi trong OCMock, mà đã được cố định ngay bây giờ: https://github.com/erikdoe/ocmock/pull/41 Nếu bạn nhìn vào các nhận xét về yêu cầu kéo, bạn sẽ thấy tại sao chỉ có vấn đề với một số cấu trúc (thường là lớn). –

Trả lời

0

này có vẻ là một bug trong OCMock. hiện đã được sửa.

4

OCMOCK_VALUE thường cho nguyên thủy (BOOL, NSInteger, vv) Dường như OCMOCK_VALUE không làm việc tốt với cấu trúc, theo các liên kết sau đây.

Nếu bạn sử dụng các loại được cung cấp bởi các bài OCMock Return a struct, bạn có thể làm điều gì đó như:

- (void)test__callFoo__invokesWithMockingFoo { 
    ViewController *sut = [[ViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:sut]; 

    CGRect rect = CGRectMake(0, 0, 0, 0); 
    [[[master expect] andReturnStruct:&rect objCType:@encode(CGRect)] foo]; 
    [sut callFoo]; 
    [master verify]; 
} 

Ngoài ra, bạn có thể sử dụng OCMOCK_STRUCT fr om Using a struct with OCMock or Hamcrest

- (void)test__callFoo__invokesWithMockingFoo { 
    ViewController *sut = [[ViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:sut]; 

    CGRect rect = CGRectMake(0, 0, 0, 0); 
    [[[master expect] andReturn:OCMOCK_STRUCT(CGRect, rect)] foo]; 
    [sut callFoo]; 
    [master verify]; 
} 
+0

Tôi đã thử 'CGRect rect = {0, 0, 0, 0}; NSValue * valRect = [Giá trị NSValueWithBytes: & rect objCType: @encode (CGRect)]; [[[master expect] vàReturnValue: valRect] foo]; 'nhưng nó bị lỗi. –

+0

Bạn đã thử '[[[master expect] vàReturn: valRect] foo];'? – catcyborg

+0

Vâng, tôi đã thử rằng vẫn còn kết quả tương tự. –

Các vấn đề liên quan