OCMock协议属性?

时间:2016-03-28 15:18:14

标签: ios protocols ocmock

我正在使用OCMock模拟协议。我尝试为mockDelegate设置我的属性,但它没有设置。我做错了吗?

id mockDelegate = [OCMockObject mockForProtocol:@protocol(TestDelegate)];
[mockDelegate setMyFloatProperty:100.0];

1 个答案:

答案 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