我正在使用OCMock模拟协议。我尝试为mockDelegate设置我的属性,但它没有设置。我做错了吗?
id mockDelegate = [OCMockObject mockForProtocol:@protocol(TestDelegate)];
[mockDelegate setMyFloatProperty:100.0];
答案 0 :(得分:0)
OCMock将为您创建实现协议的方法(包括myFloatValue属性),但是,默认情况下,它们不会执行超出nil对象默认值的任何操作:
- (CGFloat)myFloatProperty {
return 0.0f;
}
- (void)setMyFloatProperty {
}
如果你希望myFloatProperty 总是返回一个特定的值,你需要使用OCMStub来存根该属性的getter:
id mock = OCMProtocolMock(@protocol(TestDelegate));
[mock setMyFloatProperty:100.0f];
NSLog(@"%f", [mock myFloatProperty]); // prints 0.000000
OCMStub([mock myFloatProperty]).andReturn(100.0f);
NSLog(@"%f", [mock myFloatProperty]); // prints 100.000000
如果您希望在测试过程中更改属性,可以选择一些选项。最简单的方法是在测试用例类上创建存根属性,并将存根方法重定向到该属性。
@interface MyTestCase : XCTestCase
@property CGFloat stubMyFloatProperty;
@end
@implementation MyTestCase
- (void)testTestDelegate {
id mock = OCMProtocolMock(@protocol(TestDelegate));
[[[[mock stub] ignoringNonObjectArgs] andCall:@selector(setStubMyFloatProperty:) onObject:self] setMyFloatProperty:0.0f];
OCMStub([mock myFloatProperty]).andCall(self, @selector(stubMyFloatProperty));
[mock setMyFloatProperty:100.0f];
NSLog(@"%f", [mock myFloatProperty]); // prints 100.000000
}
@end
请注意,因为myFloatProperty是基本类型,所以必须使用非标准的OCMock语法才能正确地为任意值存根。有关详细信息,请参阅this answer。