我正在使用OCMockito,我想在我的ViewController中测试一个使用NetworkFetcher对象和块的方法:
- (void)reloadTableViewContents
{
[self.networkFetcher fetchInfo:^(NSArray *result, BOOL success) {
if (success) {
self.model = result;
[self.tableView reloadData];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
特别是,我想要模拟,fetchInfo:
以便它返回一个虚拟result
数组而不会访问网络,并验证该reloadData
方法是否被调用,UITableView
并且模型应该是它应该是什么.
由于此代码是异步的,我假设我应该以某种方式捕获块并从我的测试中手动调用它.
我怎么能做到这一点?
我在ClassA中有这两种方法
-(IBAction)onSubmit;
-(void)validateName:(NSString*)name;
Run Code Online (Sandbox Code Playgroud)
@implementation
- (IBAction)onSubmit {
[self validateName:self.textfield.text];
}
-(void)validateName:(NSString*)name{
// do something
}
Run Code Online (Sandbox Code Playgroud)
我的测试如下所示:
//given
ClassA *classA = mock([ClassA class]);
classA.textfield.text = @"Foo";
// when
[classA onSubmit];
[verify(classA) validateName:@"Foo"];
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我一直在:
Expected 1 matching invocation, but received 0
Run Code Online (Sandbox Code Playgroud)
在调用onSubmit时,如何编写验证validateName是否已执行的测试.
我有一个单元测试:
- (void)testFetchTrackByTrackIdIsATrack
{
[self addTrackWithSongId:@"123"];
Track *fetchedTrack = [self.library trackByTrackId:@"123"];
assertThat(fetchedTrack, instanceOf([Track class]));
}
Run Code Online (Sandbox Code Playgroud)
哪个失败了:
file:///Users/elliot/Development/Hark/HarkTests/TestLibrary.m: test failure:
-[TestLibrary testFetchTrackByTrackIdIsATrack] failed: Expected an instance
of Track, but was Track instance <Track: 0x6180001077d0>
Run Code Online (Sandbox Code Playgroud)
我有几个其他测试使用相同的实例检查不同的类工作 - 但我无法锻炼为什么这不起作用.深入研究:
- (void)testFetchTrackByTrackIdIsATrack
{
[self addTrackWithSongId:@"123"];
Track *fetchedTrack = [self.library trackByTrackId:@"123"];
Class c1 = [fetchedTrack class];
Class c2 = [Track class];
}
Run Code Online (Sandbox Code Playgroud)
调试器报告:
c1 Class Track 0x0000000100012fe0
c2 Class 0x1000b3eb8 0x00000001000b3eb8
Run Code Online (Sandbox Code Playgroud)
注意它怎么看不到那[Track class]
是一类Track
?当我将这个相同的逻辑应用于其他传递的单元测试时,它们都会报告正确的类名.
感觉它在运行时没有类元数据,但为什么呢?
还有一些案例:
assertTrue(c1 == c2); // FAIL
assertThat([fetchedTrack …
Run Code Online (Sandbox Code Playgroud)