使用 OCMock 进行 OSX 应用程序测试

Posted

技术标签:

【中文标题】使用 OCMock 进行 OSX 应用程序测试【英文标题】:OSX application testing with OCMock 【发布时间】:2015-07-14 15:01:53 【问题描述】:

在http://pathfindersoftware.com/2009/01/testing-delegate-ocmock/ 之后,我开始使用 OSX TDD 和 OCMock。

现在,我正处于我的应用程序在启动时显示登录并希望测试具有无效/无凭据的用户无法登录的阶段。

详细来说,AppDelegate 会将自己设置为登录视图控制器的代理,尝试登录(不设置凭据),然后调用代理方法didNotAuthorizeUser。但是我在测试中遇到错误。详情如下。

对象设置

AppDelegate - 真实对象,实例化登录 vc 并符合其协议 (SomeDelegateProtocol) Lo​​ginVC - 模拟 应用程序 - 模拟

测试.m

id mocklvc = [OCMockObject mockForClass:[LoginViewController class]];

[appDelegate setLoginViewController:mocklvc];

id qtApp = [OCMockObject mockForClass:[NSApplication class]];

id loginDelegate = [OCMockObject mockForProtocol:@protocol(SomeDelegate)];

[[mocklvc expect] setLoginDelegate:loginDelegate]; 
[[mocklvc expect] authenticateWithService];
[[loginDelegate expect] didNotAuthorizeUser];


//This row returns NSInternalConsistencyException
//OCMockObject[LoginViewController]
//unexpected method invoked setLoginDelegate:<AppDelegate>
[appDelegate applicationDidFinishLaunching:qtApp]; 

[mocklvc verify];

AppDelegate.m

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
        
    [self.loginViewController setLoginDelegate:self];

LoginViewController.h/.m

@property (weak) id loginDelegate;

错误信息

调用应用程序didFinishLaunchingWithOptions时:测试中出现如下错误,

NSInternalConsistencyException OCMockObject[LoginViewController] unexpected method invoked setLoginDelegate:&lt;AppDelegate&gt;

首先,您认为这是一个好的设置吗?关于如何重写测试或实际解决错误的任何想法?

【问题讨论】:

您看到的错误表明 setLoginDelegate: 根本没有被调用,或者它没有被以 loginDelegate 作为参数调用。这是有道理的,因为我不知道您的应用程序委托如何知道您创建的登录委托模拟。我将您的测试分为两部分 - 一个测试登录在启动时被调用,另一个直接测试登录控制器。您可能想通读其他人的测试,以了解应该如何构建它们。 我将参数交换给了 appDelegate - 因为这是在 AppDelegate.m 中调用的实际参数。有时这些小 cmets 确实会引导一个人走上正确的道路 :) 谢谢! 【参考方案1】:

loginDelegate 换成appDelegate 解决了这个问题。

【讨论】:

以上是关于使用 OCMock 进行 OSX 应用程序测试的主要内容,如果未能解决你的问题,请参考以下文章

XCode - iOS - <OCMock/OCMock.h> 文件未找到

如何使用 OCMock 测试类方法

使用 OCMock 和 MagicalRecord 进行单元测试

使用 OCMock 测试 NSWidowController

使用 OCMock 静态库进行 iOS 单元测试(-ObjC 标志问题)

OCMock 对带有参数的方法进行 OCMock 并返回一个值