热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ObjectiveC-UnitTesting&MockingObjects?

HowdoyouunittestObjectiveCcode?(iPhone)你如何单元测试ObjectiveC代码?(苹果手机)Inotherlanguagessuc

How do you unit test Objective C code? (iPhone)

你如何单元测试Objective C代码? (苹果手机)

In other languages such as java and .Net you can use Dependency Injection, to be able to unit test and pass mocked object in your current code. However, I could not find a reliable dependency injection framework for objective c.

在其他语言(如java和.Net)中,您可以使用依赖注入,以便能够在当前代码中进行单元测试并传递模拟对象。但是,我无法为目标c找到可靠的依赖注入框架。

Let's say you want to write a unit test for the code below, how can you mock MyObject?

假设你想为下面的代码编写一个单元测试,你怎么能模拟MyObject?

- (void) methodToBeTested
{
     NSString str = @"myString";
     MyObject object = [[MyObject alloc] init];
     [object setString:str];
     [object doStuff];
     [object release];
}

This is how I would do it with dependency injection. Is there a similar way to achieve this on objective c?

这就是我如何通过依赖注入来做到这一点。是否有类似的方法在目标c上实现这一目标?

@Inject MyObject object;

public void methodToBeTested()
{
     String str = "myString";
     // object is automatically instantiated (Dependency Injection)
     object.setString(str);
     object.doStuff();
}

3 个解决方案

#1


11  

Inversion of control is still feasible in objective-c. You can certainly design your classes with constructor-based or property-based dependency injection in mind but I don't think you'll find an annotation based dependency injection framework like you are used to.

在目标c中,控制反转仍然是可行的。您当然可以设计基于构造函数或基于属性的依赖注入的类,但我认为您不会像以前那样找到基于注释的依赖注入框架。

[[ClassToBeTested alloc] initWithDependency:foo andOtherDepedency:bar];

ClassToBeTested *objectUnderTest = [[ClassToBeTested alloc] init];
objectUnderTest.dependency = foo;
objectUnderTest.otherDependency = bar;

I've seen a couple of different approaches to building dependency injection frameworks for objective-c including https://github.com/mivasi/Objective-IOC but I can't comment on their maturity or usefulness.

我已经看到了为objective-c构建依赖注入框架的几种不同方法,包括https://github.com/mivasi/Objective-IOC,但我无法评论它们的成熟度或实用性。

For object mocking and stubbing look at OCMock.

对于对象模拟和存根,请查看OCMock。

#2


7  

how can you mock MyObject?

你怎么能模仿MyObject?

- (void) methodToBeTestedWithObject:(MyObject *)object
{
     NSString str = @"myString";
     [object setString:str];
     [object doStuff];
}

To test:

去测试:

- (void)testMethodToBeTested {
    id mockMyObject = [OCMock mockForClass:[MyObject class]];

    [[mockMyObject expect] setString:[OCMock any]];
    [[mockMyObject expect] doStuff];

    [objectToTest methodToBeTestedWithObject:mockMyObject];
    [mockMyObject verify];
}

Using, as mentioned in @Jonah's answer, the excellent OCMock. Don't bother trying to do capital-D, capital-I Dependency Injection in obj-c, it's more work than it's worth.

正如@Jonah的回答中所提到的,使用优秀的OCMock。不要费心去做资本-D,资本-I Dependency Injection in obj-c,它的工作量超过了它的价值。

#3


1  

Here's a dependency injection framework for Objective-C: http://www.typhoonframework.org

这是Objective-C的依赖注入框架:http://www.typhoonframework.org

Besides addressing on the design aspects of DI, it has a strong focus on being able to configure components for production vs test scenarios (integration testing). This includes:

除了解决DI的设计方面外,它还非常注重能够为生产与测试场景(集成测试)配置组件。这包括:

  • Ability to inject values represented as strings - these are converted to the required type at runtime.
  • 能够注入表示为字符串的值 - 这些值在运行时转换为所需的类型。
  • Configuration management via an external properties file.
  • 通过外部属性文件进行配置管理。
  • Asynchronous test execution - allowing you to test methods that run on a background thread.
  • 异步测试执行 - 允许您测试在后台线程上运行的方法。

推荐阅读
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
  • flea,frame,db,使用,之 ... [详细]
  • 在Matlab中,我尝试构建了一个神经网络模型,用于预测函数 y = x^2。为此,我设计并实现了一个拟合神经网络,并对其进行了详细的仿真和验证。通过调整网络结构和参数,成功实现了对目标函数的准确估计。此外,还对模型的性能进行了全面评估,确保其在不同输入条件下的稳定性和可靠性。 ... [详细]
  • 本文深入解析了 Golang 中的异步 API,并通过具体的应用实例展示了其强大功能。文章不仅探讨了 Golang 和 Erlang 在并行处理方面的核心理念,还详细介绍了如何利用通道(channel)和 goroutine 实现高效的并发编程。例如,通过 `ch := make(chan int)` 创建通道,并使用 `go func(ch chan int)` 启动 goroutine 来处理异步任务。此外,文章还提供了多个实际案例,帮助读者更好地理解和应用这些概念。 ... [详细]
  • 通过采用JSON数据格式,能够高效且精确地获取用户的实时地理位置信息,为各类位置服务应用提供可靠的数据支持。该方法不仅简化了数据交换流程,还提高了地理信息处理的准确性和效率,适用于移动应用、导航系统及物联网设备等多种场景。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 本文探讨了在一个使用Mongoid框架的项目中,如何处理当HABTM(has_and_belongs_to_many)关系中的逆向关联设置为nil时,子对象无法正确持久化的问题。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 在Qt框架中,信号与槽机制是一种独特的组件间通信方式。本文探讨了这一机制相较于传统的C风格回调函数所具有的优势,并分析了其潜在的不足之处。 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 智能网联汽车自动驾驶功能测试场地的方法与标准要求
    智能网联汽车自动驾驶功能测试场地的方法与标准要求 ... [详细]
author-avatar
手机用户2602906305_849
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有