我有一个类,假设在调用方法时返回一个字符串.我怎样才能创建一个模拟对象.
我希望mock在调用方法"sayHello"时返回@"Hello"
id mock = [OCMockObject mockForClass:[MyCrazyClass class]];
Run Code Online (Sandbox Code Playgroud) 我设置了这样的模拟观察者:
id quartileObserverMock = [OCMockObject observerMock];
[[NSNotificationCenter defaultCenter] addMockObserver:quartileObserverMock
name:kVPAdPlayerDidReachQuartileNotification
object:self.adPlayer];
[[quartileObserverMock expect]
notificationWithName:kVPAdPlayerDidReachQuartileNotification
object:self.adPlayer
userInfo:@{@"quartile" : @(VPAdPlayerFirstQuartile), @"trackingEvent" : VPCreativeTrackingEventFirstQuartile}];
Run Code Online (Sandbox Code Playgroud)
我的单元测试运行; 但是当发布通知时,我得到虚假的EXC_BAD_ACCESS错误.
即
[[NSNotificationCenter defaultCenter]
postNotificationName:kVPAdPlayerDidReachQuartileNotification
object:self.adPlayer
userInfo:@{@"quartile" : @(quartile), @"trackingEvent" : trackingEvent}];
Run Code Online (Sandbox Code Playgroud)
当我注释掉observermock代码时,我的测试每次运行都很好.
当我重新放入代码时,我会在postNotiicaitonName:object:userInfo上发生虚假崩溃,可能每2.5次一次.
有人有任何想法吗?
我有一个类来处理我的所有网络通信,如下所示:
typedef void (^ networkEndblock) (NSArray *, NSError *);
@interface NetworkAPI : NetworkBase
+ (void) doSomeNetworkAcion:(networkEndblock) endBlock;
@end
Run Code Online (Sandbox Code Playgroud)
我使用上面这样的代码(我不想在这里讨论不相关的细节)
- (void) runMyProcess:(SomeEndBlock)proccesEnded{
// Bussiness logic
// Get Data from the web
[NetworkAPI doSomeNetworkAcion:^(NSArray *resultArray, NSError *error){
// Check for error. if we have error then do error handling
// If no error, check for array.
// If array is empty then go to code that handles empty array
// else Process data
}];
}
Run Code Online (Sandbox Code Playgroud)
在我的测试方法中,我想触发runMyProcess进行测试,我不想让它去网络,我想控制它并设置案例以使其返回错误,空数组等等.我知道如何使用SenTest,它是MACROS,但我不知道如何伪造我的网络API.
我查看存根并期待,但如果我能做我想做的事情,我会感到困惑.
谢谢
我想测试我在数据库中插入的值是否会发送回我的类的委托.
我试图模拟委托,并期望我用来填充数据库的数组.它失败是因为2 NSArray具有相同的内容但是是不同的对象.
我已经尝试在我的模型上实现isequal和hash方法,但没有成功.
这是错误日志:
'OCMockObject[NewsListViewController]: unexpected method invoked: service:<RSSService-0x4c25b90-324400011.636966: 0x4c25b90> didFinishParsingRSSWithItems:(
description102362,
description102362,
description102362,
description102362,
description102362
)
expected: service:<OCMAnyConstraint: 0x4c10f30> didFinishParsingRSSWithItems:(
description102362,
description102362,
description102362,
description102362,
description102362
)'
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?
这是我的测试:
- (void) testServiceShouldNotLoadArticlesFromRSSFeedIfArticlesInDatabase {
NSArray *fakeArticles = [TestUtils createArticles:5];
[[DatabaseManager sharedManager] saveArticles:fakeArticles];
RSSService *mockService = [OCMockObject partialMockForObject:service];
id mockDelegate = [OCMockObject mockForClass:NewsListViewController.class];
[[mockDelegate expect] service:[OCMArg any] didFinishParsingRSSWithItems:fakeArticles];
mockService.delegate = mockDelegate;
[mockService loadAllArticles];
[mockService verify];
[mockDelegate verify];
}
Run Code Online (Sandbox Code Playgroud)
这是我正在测试的方法:
- (void) loadAllArticles {
NSArray *articles = [self articlesFromDatabase];
[self.delegate service:self …
Run Code Online (Sandbox Code Playgroud) 我试图测试一个实例化实例的方法MFMailComposeViewController
.被测试的方法调用的多种方法MFMailComposeViewController
,包括setSubject:
.
我想测试setSubject是否发送了一个特定的NSString,在本例中是@"Test Message".
无论我为模拟存根中的预期字符串指定什么,都没有失败.
在单元测试类中:
#import <OCMock/OCMock.h>
- (void)testEmail {
TestClass *testInstance = [[TestClass alloc] init];
id mock = [OCMockObject mockForClass:[MFMailComposeViewController class]];
[[mock stub] setSubject:@"Test Message"];
[testInstance testMethod];
}
Run Code Online (Sandbox Code Playgroud)
在TestClass中:
- (void)testMethod {
MFMailComposeViewController *mailComposeVC = [[MFMailComposeViewController alloc] init];
[mailComposeVC setSubject:@"Bad Message"];
}
Test Suite 'Email_Tests' started at 2011-09-17 18:12:21 +0000
Test Case '-[Email_Tests testEmail]' started.
Test Case '-[Email_Tests testEmail]' passed (0.041 seconds).
Run Code Online (Sandbox Code Playgroud)
测试应该失败.
我在iOS模拟器中对此进行测试,并在设备上获得相同的结果.
我究竟做错了什么?有没有办法实现这个目标?
这不是最好的事情,但我想验证一个对象的私有方法被调用,所以我创建一个局部模拟并在私有方法上添加一个期望.
Synchronizer * sync = [[Synchronizer alloc] initWithCleanup:YES];
sync = [OCMockObject partialMockForObject:sync];
[[(id)sync expect] cleanupPreviousContents];
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,不调用cleanupPreviousContents但测试仍然成功.这个bug在哪里?
问候,昆汀
我正在使用OCMock,我正试图在我的一个测试中做到这样的事情:
[[mockScrollView expect] setContentSize:[OCMArg any]];
Run Code Online (Sandbox Code Playgroud)
问题是[OCMArg any]
返回一个id
类型,我想使用任何类型CGSize
,因为我不知道它的确切值.我怎么能通过这个论点?
我正在学习iOS中的OCMock.可以有人让我知道"niceMockForClass""partialMockForObject"和"mockForClass"方法之间的区别.如何以及何时使用所有这三个.我创建了一个名为"CustomClass"的自定义类.它有一个方法"verifySetUp".现在,我需要测试一下吗?
-(void)testVerifyMethod {
CustomClass *cc = [[CustomClass alloc] init];
id mock = [OCMockObject partialMockForObject:cc];
[[mock stub] verifySetUp];
[mock verify];
}
Run Code Online (Sandbox Code Playgroud)
将partialMockForObject更改为niceMockForClass或mockForClass时,会成功测试该方法.现在,我只想知道何时以及如何使用这三种方法.
如何在OCMock中为连接创建Mock以及如何使用它?
我试图在同一组单元测试中同时使用OCMock和Nocilla.我使用CocoaPods来安装它们,并使用它们引用它们
#import <OCMock/OCMock.h>
#import <Nocilla/Nocilla.h>
Run Code Online (Sandbox Code Playgroud)
但是当我尝试以下列方式使用Nocilla的.andReturn时(其中subscriptionData是NSData*):
stubRequest(@"GET", @"https://api.test.com/api/beaconinbox/subscriptions/list").andReturn(200).withBody(subscriptionData);
Run Code Online (Sandbox Code Playgroud)
我得到一个看起来像这样的编译器错误:
/Users/ravi/GitHub/Mobile/ClinicalInbox/ClinicalInboxTests/ClinicalInboxTests.m:63:93:在'LSStubRequestDSL*'类型的对象上找不到属性'_andReturn'
在我#import "<OCMock/OCMock.h>"
从代码中删除之前一直存在.然后我的所有测试运行完美.
是否已知与OCMock和Nocilla不兼容?我似乎无法在任何地方找到一个 - 实际上我已经看到了恰恰相反 - 许多人在同一个测试框架中一直使用它们的例子.所以我必须假设我做错了什么,谁能告诉我什么?
为了测试托管类,我尝试在单元测试中创建一个实例,首先尝试模拟NSEntityDescription和NSManagedObjectContext.
id mockEntityDesc = [OCMockObject niceMockForClass:[NSEntityDescription class]];
id mockManagedObjectContext = [OCMockObject mockForClass:NSManagedObjectContext.class];
Run Code Online (Sandbox Code Playgroud)
但在我进一步研究之前,我在测试运行时遇到以下错误;
体系结构i386的未定义符号:"_ OBJC_CLASS _ $ _ NSEntityDescription",引自:CallsCoordinatorTests.o中的objc-class-ref"_OBJC_CLASS _ $ _ NSManagedObjectContext",引自:CallsCoordinatorTests.o中的objc-class-ref ld:未找到符号对于体系结构i386 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
有什么建议吗?谢谢
objective-c ocmock nsmanagedobjectcontext ios nsentitydescription
ocmock ×10
objective-c ×6
ios ×4
unit-testing ×4
mocking ×2
cgsize ×1
ios7 ×1
iphone ×1
nocilla ×1
ocunit ×1