OSX 使用 OCMock 进行应用程序测试
OSX application testing with OCMock
在 http://pathfindersoftware.com/2009/01/testing-delegate-ocmock/ 之后,我开始使用 OSX TDD 和 OCMock。
现在,我正处于我的应用程序在启动时显示登录并希望测试具有 invalid/no 凭据的用户无法登录的阶段。
具体来说,AppDelegate 会将自己设置为登录视图控制器的委托,尝试登录(不设置凭据),然后调用委托方法 didNotAuthorizeUser
。但是我在测试中遇到错误。更多详细信息如下。
对象设置
- AppDelegate - 真实对象,实例化登录 vc 并符合其协议 (
SomeDelegateProtocol
)
- LoginVC - 模拟
- 应用程序 - 模拟
Test.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
@属性 (弱) id < SomeDelegate > loginDelegate;
错误信息
当调用应用程序 didFinishLaunchingWithOptions: 我在测试中得到以下错误,
NSInternalConsistencyException OCMockObject[LoginViewController] unexpected method invoked setLoginDelegate:<AppDelegate>
您首先认为这是一个好的设置吗?关于如何重写测试或实际解决错误的任何想法?
将 loginDelegate
换成 appDelegate
解决了问题。
在 http://pathfindersoftware.com/2009/01/testing-delegate-ocmock/ 之后,我开始使用 OSX TDD 和 OCMock。
现在,我正处于我的应用程序在启动时显示登录并希望测试具有 invalid/no 凭据的用户无法登录的阶段。
具体来说,AppDelegate 会将自己设置为登录视图控制器的委托,尝试登录(不设置凭据),然后调用委托方法 didNotAuthorizeUser
。但是我在测试中遇到错误。更多详细信息如下。
对象设置
- AppDelegate - 真实对象,实例化登录 vc 并符合其协议 (
SomeDelegateProtocol
) - LoginVC - 模拟
- 应用程序 - 模拟
Test.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
@属性 (弱) id < SomeDelegate > loginDelegate;
错误信息
当调用应用程序 didFinishLaunchingWithOptions: 我在测试中得到以下错误,
NSInternalConsistencyException OCMockObject[LoginViewController] unexpected method invoked setLoginDelegate:<AppDelegate>
您首先认为这是一个好的设置吗?关于如何重写测试或实际解决错误的任何想法?
将 loginDelegate
换成 appDelegate
解决了问题。