单元测试初始化​​故事板

时间:2015-08-01 11:08:08

标签: ios uitableview unit-testing storyboard

单元测试有很多资源,无论是纯粹的逻辑还是应用程序级别,我目前正在尝试测试在故事板中有IBOutlets的UITableViewCell,并且有几个帖子已经确认我是否希望实例化故事板,然后实例化包含单元格的视图控制器。因此,您必须完成几个步骤,以确保故事板和后续元素与其IBOutlet正确加载

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
self.vc = [storyboard instantiateViewControllerWithIdentifier:@"testTableViewController"];
[self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];

后面跟着此代码从UITableViewCell

获取UITableViewController
[self.vc setTableViewData:@[@1].mutableCopy];
[self.vc.tableView reloadData];
[self.vc.tableView layoutIfNeeded];

SUT = [self.vc.tableView dequeueReusableCellWithIdentifier:@"More Menu Cell"
                                         forIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

然后这会产生一个单元格然而对于我来说,我在被测系统中的第一个断点似乎表明IBOutlets已经加载了,但是当我真正去断言什么时,它们突然消失了一个我...

参考文献无缘无故消失或我做错了。

1 个答案:

答案 0 :(得分:1)

所以我做了一些我将在这里分享的发现,其中一个是我问题的解决方案,而最初这个问题是我试图解决一个更大问题的一个小症状。

更大的问题是,我正在测试一些UITableViewCells,但不幸的是他们的IBOutlets从故事板连接起来总是为零,这导致我试图弄乱应该如何初始化被测系统。

我还发现使用[self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];的结果不一致,因为有时我仍然需要调用viewviewDidLoad才能正确初始化。所以,我完全取消了它,只需要调用view,它似乎工作正常。

然而,尽管我的变化如上,但我的细胞仍然没有出口。我在互联网上搜索了一下之后发现,你应该只使用[self.tableView registerClass:[MyTableViewCell class]forCellReuseIdentifier:@"MytableViewcell"]; ,如果它已经在故事板中创建了作为原型单元创建。看起来它已经为此做了您并尝试再次尝试打破IBOutlets

另一个小小的发现是试图通过设置UIViewController来测试我的MyViewController *SUT = [MyViewController new]; [SUT view];

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SUT = [storyboard instantiateViewControllerWithIdentifier:@"My Table VC"];
[SUT view];  

现在虽然这个初始化,但是由于这个类存在于故事板中,所以似乎还有一些缺失的步骤,因此我推荐以下

@{ ViewBag.Title = "Home Page"; }
    <script scr="~/scripts/knockout-3.3.0.js" type="text/javascript">
<div data-bind="template: 'friendsTemplate'"></div>


    <script type="text/javascript">
        $(function () {
            function friend(name) {
                return {
                    name: ko.observable(name)
                };
            }
            var viewModel = {
                firstName: ko.observable('Hemant'),
                lastName: ko.observable('Shelar'),
                friends: ko.observableArray([new friend('Atul'), new friend('Atul'), new friend('Atul')])
            };
            viewModel.fullName = ko.dependentObservable(function () {
                return this.firstName() + ' ' + this.lastName()
            }, viewModel);

            ko.applyBindings(viewModel);

            alert('ok');

        });
    </script>

    <script id="friendsTemplate" type="text/html">
        <ul>
            {{each(index,friend) friends}}
            <li>
                ${friend.name}
            </li>
            {{/each}}
        </ul>
    </script>