Arclin

Advocate Technology. Enjoy Technology.

0%

关于第三方单元测试框架的简单说明

关于第三方单元测试框架的简单说明

Pod安装

Podfile编写(框架只能安装在UnitTest的Target中)

1
2
3
4
5
6
7
8
9
target 'BaZiPaiPanSDK' do
...
target 'BaZiPaiPanSDKTests' do
inherit! :search_paths
pod 'Specta'
pod 'Expecta'
pod 'OCMock'
end
end

Specta

  • Specta是一个BDD(行为驱动开发)框架
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#import <OCMock/OCMock.h>
#import <Specta/Specta.h>
#import <Expecta/Expecta.h>
#import <ReactiveCocoa/ReactiveCocoa.h>
#import "BZPPCaiYunViewModel.h"

SpecBegin(BZPPCaiYunViewModel) // 声明了一个测试类

__block BZPPCaiYunViewModel *viewModel; // 我们要测试这个类

beforeEach(^{ // 通过beforeEach 首先先初始化
viewModel = [[BZPPCaiYunViewModel alloc] init];
});

describe(@"BZPPCaiYunViewModel", ^{ // 声明一组用例

it(@"refresh when data isn't empty", ^{ // 通过 it 声明一个用例,前面的字符串是一个描述
__block id result;
waitUntil(^(DoneCallback done) { // 假设这里有网络请求,所以需要异步,有点像GCD的信号量
[[viewModel.loadDataCommand execute:nil] subscribeNext:^(id x) {
result = x;
done(); // 请求结束,告知框架可以继续往下走
}];
});
expect(result).notTo.beNull(); // 这里是Expecta框架的内容,后面解释
});
});

afterEach(^{
viewModel = nil; // 测试结束,清空
});

SpecEnd // 类的结束,相当于 @end

OCMock

  • OCMock一般用来构造伪数据,比如说有时候我们一个方法内部需要通过很多数据才能完成,但是这些数据需要其他复杂的实现去获取,这时候我们用OCMock就可以方便地创造这些数据

  • OCMock可以做的事情大概如下

    • 指定一个方法的返回值
    • 验证某个方法是否有被调用 (比如说指定了错误的数据会不会调用处理异常的方法)
    • 验证方法block传出来的参数是否符合预期
    • 模拟UI和验证UI的显示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SpecBegin(BZPPCaiYunViewModel)

__block BZPPCaiYunViewModel *viewModel;

beforeEach(^{

});

describe(@"Test OCMock", ^{
it(@"It should not to be null", ^{
id mockManager = OCMClassMock([BZPPHunLianManager class]); // 因为是单例所以要用这种方法mock一个对象
OCMStub([mockManager sharedInstance]).andReturn([BZPPHunLianManager class]); // 同上,调用单例方法返回一个单例对象, OCMStub意思就是模拟执行某个方法, 用andReturn返回指定的值
OCMVerify([mockManager getGanQingHunYinData:OCMOCK_ANY isMale:YES]); // 验证这个方法是否在上面的过程中被调用了,结果是没有被调用,测试失败
});
});

afterEach(^{

});

SpecEnd

Expecta

  • Expecta是一个断言框架, 语法十分地通俗易懂, 很接近自然语言
  • Expecta的用法比较简单
1
2
3
expect(obj).to.beNull(); // 期望某对象应该是空值
expect(obj).toNot.beNull(); // 期望某对象不应该是空值
expect(obj).equal(xxx); // 期望等于某个值

诸如此类比较多可以去看Github官方文档