Protocol LYTViewProvider
<pre>
+(NSDictionary) dataSpecForTest;
</pre>
Mock数据,返回JSON格式的字典。Example:
+(NSDictionary *)dataSpecForTest {
return @{
@"icon":[[LYTDataValues alloc] initWithValues:@[@"",@"icon_string"]],
@"string":[[LYTDataValues alloc] initWithValues:@[@"预计xx送达",@""]],
};
}
测试次数:2*2 = 4
写测试的时候尽量把各种临界情况覆盖进去,不过在在效果图的宽高可能固定,或者内容一定有的时候可以酌情不考虑临界情况。
这里涉及到了这个库里面自带的一些数据类型比如:
这些类都是用在上面这个字典里面的,我们仔细看一下LYTStringValues.m
- (NSArray *)values {
return @[
@"Normal length string",
@"",
[NSNull null],
@"Very long string. This string is so long that it's longer than I want it to be. Just a really really long string. In fact, it's just long as long can be. I'm just lengthening the longest string by making it longer with more characters. Do you think this is long enough yet? I think so, so I'm going to stop making this long string longer by adding more characters.",
@"漢語 ♔ 🚂 ☎ ‰ 🚀 Here are some more special characters ˆ™£‡‹·Ú‹›`å∑œ´®∆ƒ∆√˜Ω≥µ˜ƒª•"
];
}
这个说明在测试这个属性对应的组件的时候有5种情况。
所有的这些类都是继承自LYTDataValues
,重写其- (NSArray *)values()
即可定义自己项目中所需要的类型。
但是我建议之间用LYTDataValues
类来写字典中的对象,这样是比较方便的。
<pre>
+(UIView *)viewForData:(NSDictionary *)data
reuseView:(UIView *)reuseView
size:(LYTViewSize *)size
context:(id _Nullable __autoreleasing *)context
{}
</pre>
首先要说的是,这个方法会执行多次。如上面所说的4次,如果你还设置了屏幕类型,那么还得乘屏幕类型个数:2*2*4(ip4,ip5,ip6,ip6+)。
测试 reuse view,特别是cell。
data
:dataSpecForTest
这个方法返回的对象
size
:sizesForView
这个方法返回屏幕尺寸信息
<pre>
+ (NSArray<LYTViewSize *> *)sizesForView {
return @[
[[LYTViewSize alloc] initWithWidth:@(LYTiPhone4Width)],
[[LYTViewSize alloc] initWithWidth:@(LYTiPadWidth)]
]
}
</pre>
测试不同大小下的情况,每种尺寸执行一次。可以width不变,变height。也可以height不变边width。也可以dynamically set动态设置。该方法一定要写,因为有的人的布局是依靠layoutSubView
这个系统方法,如果不设置,一般是{{0,0},{0,0}}。
Tips:
1.如果一个大的component有很多小的component组成,建议直接测大的component,因为这样的测试最好能看到一个完整的效果展示。
2.有些component属性需要设为Public,我们在.h文件里面把它设为只读。
3.测试的时候,比较的两个视图必须处于视图层级的同一级别。即,相同的父视图,这一点很重要。
4.如果你是在LayoutSubview里面布局,一定要触发该方法,不然是得不到正确的frame的,一般是{{0,0},{0,0}}。
(本项目内部使用)扩展:
XCTestCenterYEqual
XCTestCenterXEqual
以上两个精确到1point
** 测试辅助类**
MSLayoutTestDataHandler
/**
* convert system coordinate
*
* @param superView target view
* @param currentView super view of current view
* @param frame current's frame
*
* @return
*/
- (UIView *)commonSuperView:(UIView \*)superView
currentView:(UIView *)currentView
targetFrame:(CGRect)frame;