在 XCTest 中如何知道方法中的方法是不是已被调用

Posted

技术标签:

【中文标题】在 XCTest 中如何知道方法中的方法是不是已被调用【英文标题】:How to know whether the method inside a method has been called or not in XCTest在 XCTest 中如何知道方法中的方法是否已被调用 【发布时间】:2016-01-11 09:27:47 【问题描述】:

如何使用 Xcode 7 在 XCTest 框架中验证方法内的方法是否已被调用。

我想弄清楚的示例方法是

-(void)setupMapAria 
//some code
[self setUpLocation:[UserDetails currentLocation]];
//some code.

这里我如何检查或编写单元测试用例setUpLocation 是否被调用。(注意这个方法不返回任何东西)。

【问题讨论】:

最简单的测试方法是使用模拟。 会在 xcode 7.2 中模拟支持吗?怎么做。我认为它是在旧版本的 xcode 中。 我是单元测试新手。如果可能的话,给我一个带有 OCMock 框架的 xcode 7.2 文档链接的链接 OCMock的网站有你需要知道的一切。 【参考方案1】:

我猜你不想测试setUpLocation 已被调用。如果可能的话,更好的测试是在给定特定位置的情况下测试该方法的所需结果

在这种情况下,挑战是用测试输入代替[UserDetails currentLocation],以便您可以控制测试。我们要注入依赖。

Dependency Injection 有多种形式。在您的示例中,额外的挑战是在生产代码中,setupMapAria 每次都应该获得当前位置的新实例

一个简单的方法是使用方法注入。我们可以创建一个新方法:

-(void)setupMapAriaWithLocation:(UserLocation *)location;

测试更容易!只需传递您需要的任何内容。然后测试可以查询setUpLocation: 所做的任何事情的状态。

至于setupMapAria,你现在可以选择了。您可以保留它,只需调用setupMapAriaWithLocation:。或者您可以消除它,并将调用者更改为传入当前位置。 …您甚至可能会发现您的程序因此更加灵活,因为您可以处理当前位置以外的位置。 (例如,用户在不同时间点的位置。)

【讨论】:

以上是关于在 XCTest 中如何知道方法中的方法是不是已被调用的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XCTest 中的 UI 目标调用主目标中的方法?

如何检查大型镶木地板文件中的列是不是已被修改?

在 XCTest 中:如何测试函数是不是强制执行到主线程

xctest - 如何测试是不是在按下按钮时加载新视图

Xcode 7 中的 XCTest:如何验证视图中是不是存在某些文本

为啥@interface 中声明的变量中的值不会在 XCTest 中的方法之间持续存在?