首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCMock协议属性?

OCMock协议属性?
EN

Stack Overflow用户
提问于 2016-03-28 15:18:14
回答 1查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
id mockDelegate = [OCMockObject mockForProtocol:@protocol(TestDelegate)];
[mockDelegate setMyFloatProperty:100.0];
EN

回答 1

Stack Overflow用户

发布于 2016-03-29 12:55:24

OCMock将为您创建实现协议的方法(包括myFloatValue属性),但是,在默认情况下,它们不会对零对象执行默认值以外的任何操作:

代码语言:javascript
复制
- (CGFloat)myFloatProperty {
    return 0.0f;
}

- (void)setMyFloatProperty {
}

如果希望myFloatProperty始终返回特定值,则需要使用OCMStub对该属性的getter进行存根:

代码语言:javascript
复制
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

如果希望在测试过程中更改属性,则有几个选项。最简单的方法是在测试用例类上创建存根属性,并将存根方法重定向到该属性。

代码语言:javascript
复制
@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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36265259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档