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ị :)
Đ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 đó. –
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 –
Đâ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). –