我想知道如何测试这个.我有一个方法,它接受一个参数,并根据该参数的一些属性创建另一个对象并对其进行操作.代码看起来像这样:
- (void) navigate:(NavContext *)context {
Destination * dest = [[Destination alloc] initWithContext:context];
if (context.isValid) {
[dest doSomething];
} else {
// something else
}
[dest release];
}
Run Code Online (Sandbox Code Playgroud)
我要验证的是,如果context.isValid为true,则在dest上调用doSomething,但我不知道如何使用OCMock或任何其他传统测试方法测试它(或者甚至可能),因为该对象是完全在方法范围内创建.我这是错误的方式吗?
我正在尝试在我的应用程序的测试中模拟UITabBarController.我在另一个文件中的其他地方定义的类上有一个类别方法,它在我的测试类中与ocmock一起导入.我正在尝试的是这样的:
- (void) setUp
{
id mockTabController = [OCMockObject mockForClass:[UITabBarController class]];
[[[mockTabController stub] andReturn:nil] displayedViewController];
// displayedViewController is the category method
}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做并且测试到达那个存根调用时,我得到一个错误说:
[NSProxy doesNotRecognizeSelector:displayedViewController] called!
Run Code Online (Sandbox Code Playgroud)
是否有一些特定的东西我需要做以允许ocmock识别内置框架类中的类别方法?
我正在使用OCMock测试真实的Web服务调用.
现在我做的事情如下:
- (void)testWebservice
{
id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)];
[[mydelegatemock expect] someMethod:[OCMArg any]];
[SUT sutWithDelegate:mydelegatemock];
// we need to wait for real result
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
[(OCMockObject*)mydelegatemock verify];
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但它暗示每个这样的测试将需要2秒.
有没有一种方法我可以设置例如,2秒的超时,并让一个呼叫someMethod
的mydelegatemock
立即verify
和完成测试案例?
有谁知道如何捕获发送到OCMock对象的参数?
id mock = [OCMockObject mockForClass:someClass]
NSObject* captureThisArgument;
[[mock expect] foo:<captureThisArgument>]
[mock foo:someThing]
GHAssertEquals[captured, someThing, nil];
Run Code Online (Sandbox Code Playgroud)
我如何验证foo的参数?我很乐意在模拟定义中的一个块内执行它,但是如果我可以将对象取出以便我可以在以后确定它的特征就会很棒.
这可能与OCMock有关吗?
我正在尝试将OCMock添加到我现有的Cocoa项目中,但我遇到了一个我没有看到其他人覆盖的奇怪问题.
我最终将它分离到以下内容:如果我只是将OCMock.framework引用添加到我的项目中(即以某种方式将其拖动到Link Binary With Libraries构建阶段),当我运行测试时,真正的应用程序将被启动.
没有OCMock,输出正常:
Test Suite 'Multiple Selected Tests' started at 2013-02-07 20:07:03 +0000
Run Code Online (Sandbox Code Playgroud)
使用OCMock框架链接(部分输出):
Error loading MyProjTests.octest/Contents/MacOS/MyProjTests
Library not loaded: @rpath/OCMock.framework/Versions/A/OCMock
Reason: image not found
IDEBundleInjection.c: Error loading bundle '/Users/alex/Library/Developer/Xcode/DerivedData/MyProj-bqwyxyspdiudktfnjcdgibdmpgsa/Build/Products/Debug/MyProjTests.octest'
Run Code Online (Sandbox Code Playgroud)
此后,其他应用程序输出显示为正常.当应用程序运行时,测试进度在项目导航器的最后一个选项卡上旋转,并且在您退出应用程序之前不会停止.因此,在您的应用运行的整个过程中,测试应该正在进行中.
清除测试主机或捆绑加载器没有解决,只产生错误架构的链接错误.
我正在使用最新的Xcode,4.6.任何帮助非常感谢.
当我想在一个方法中验证模拟对象是否按特定顺序接收某些消息时,我会执行以下操作:
// sut is an instance of the class I am testing and myMock is a mock object injected in sut.
// I want to test that myMock sends messageA and then messageB, in that particular order.
[[[myMock expect] andDo:^(NSInvocation *invocation)
{
[[myMock expect] messageB];
}]
messageA];
[sut methodToTest];
[myMock verify];
Run Code Online (Sandbox Code Playgroud)
有没有更干净/更好的方法呢?提前致谢.
我正在努力解决这个问题OCMock
.我创建了简单的类MyClass
.
@interface MyClass : NSObject
- (NSString *)simpleMethod;
@end
@implementation MyClass
- (NSString *)simpleMethod {
[self method];
return @"simple";
}
- (void)method {
NSLog(@"ABC");
}
@end
Run Code Online (Sandbox Code Playgroud)
我想要检查的是method
调用方法时simpleMethod
是否调用了方法.现在我有以下代码,但它不起作用:
- (void)testMethodInvoked
{
id mock = [OCMockObject mockForClass:[MyClass class]];
[[mock stub] simpleMethod];
SEL selector = NSSelectorFromString(@"method");
[[mock expect] methodForSelector:selector];
[mock verify];
}
Run Code Online (Sandbox Code Playgroud)
我该如何测试这个案例?我认为这很容易做到,但我不知道如何解决这个问题.
如何创建调用方法的mock和call simpleMethod
方法method
?
当前日志:
<unknown>:0: error: -[OCMockTestTests testOne] : OCMockObject[MyClass]: expected method was not invoked: methodForSelector:@selector(method)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在iOS项目中设置一个简单的OCMock单元测试,只是为了熟悉框架.
我有一个模拟的DataLoader
类,即使我自己调用这个方法,我的期望也会失败:
- (void)testSimpleMocking {
// Mock the class
id mock = [OCMockObject niceMockForClass:[DataLoader class]];
// Override the 'dispatchLoadToAppDelegate:' to be a no-op
[[[mock stub] andReturn:nil] dispatchLoadToAppDelegate:[OCMArg any]];
// Expect the method to be called
[[mock expect] dispatchLoadToAppDelegate:[OCMArg any]];
// Call the method
[mock dispatchLoadToAppDelegate:nil];
// Verify
[mock verify];
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此测试时,我收到错误:
/Users/Craig/projects/MyApp/Unknown.m: -[MockingDataLoaderTest testSimpleMocking] : OCMockObject[DataLoader]:
expected method was not invoked: dispatchLoadToAppDelegate:<OCMAnyConstraint: 0x1a3d890>
Run Code Online (Sandbox Code Playgroud)
当我自己调用这个方法时,这怎么可能?
编辑:一个更复杂的案例:
- (void)testDataLoaderWaitsForDownload {
id mock = [OCMockObject niceMockForClass:[DataLoader class]];
id metadataItem = …
Run Code Online (Sandbox Code Playgroud) 我有一个方法:
@implementation SomeClass
- (void)thisMethod:(ObjectA *)objA {
[APIClient connectToAPIWithCompletionHandler:^(id result){
if (result) [objA methodOne];
else [objA methodTwo];
}];
}
Run Code Online (Sandbox Code Playgroud)
有没有办法验证methodOne
或在调用methodTwo
时会被调用?thisMethod:
基本上我只是想存根该connectToAPIWithCompletionHandler:
方法。现在我可以通过 swizzlingconnectToAPIWithCompletionHandler:
方法来做到这一点。但我想知道是否有更好的方法。
我在这里发现了类似的问题,但它使用的是实例方法,而在我的例子中是类方法。
我想验证一个函数没有被调用。该函数在测试函数内的异步块调用中执行,因此OCMReject()
不起作用。
我测试是否确实调用了异步函数的方法如下:
id mock = OCMClassMock([SomeClass class]);
OCMExpect([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);
Run Code Online (Sandbox Code Playgroud)
如何进行测试以测试是否未调用被禁止的函数?就像是:
VerifyNotCalled([mock methodThatShouoldExecute]);
OCMVerifyAllWithDelay(mock, 1);
Run Code Online (Sandbox Code Playgroud) ocmock ×10
unit-testing ×9
ios ×6
objective-c ×5
asynchronous ×2
mocking ×2
xcode ×2
cocoa ×1
compilation ×1
iphone ×1
tdd ×1
timeout ×1
uikit ×1