标签: ocmock

目标C - 如何使用OC Mock?

我有一个类,假设在调用方法时返回一个字符串.我怎样才能创建一个模拟对象.

我希望mock在调用方法"sayHello"时返回@"Hello"

id mock = [OCMockObject mockForClass:[MyCrazyClass class]];
Run Code Online (Sandbox Code Playgroud)

iphone unit-testing mocking objective-c ocmock

2
推荐指数
1
解决办法
853
查看次数

为什么OCMock在使用mockObserver时会导致nsnotificaiton中心拥有EXC_BAD_ACCESS

我设置了这样的模拟观察者:

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次一次.

有人有任何想法吗?

ocmock

2
推荐指数
1
解决办法
1330
查看次数

OCMock一个Class方法用自定义数据回调传递的块

我有一个类来处理我的所有网络通信,如下所示:

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.

我查看存根并期待,但如果我能做我想做的事情,我会感到困惑.

谢谢

unit-testing mocking objective-c ocmock

2
推荐指数
1
解决办法
1340
查看次数

OCMock - 如何期待nsarray的内容

我想测试我在数据库中插入的值是否会发送回我的类的委托.

我试图模拟委托,并期望我用来填充数据库的数组.它失败是因为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)

objective-c ocmock

1
推荐指数
1
解决办法
1839
查看次数

使用从测试方法调用的方法的类的OCMock

我试图测试一个实例化实例的方法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模拟器中对此进行测试,并在设备上获得相同的结果.

我究竟做错了什么?有没有办法实现这个目标?

unit-testing objective-c ocunit ocmock ios

1
推荐指数
1
解决办法
3169
查看次数

是否有可能从部分模拟中"预期"一种方法

这不是最好的事情,但我想验证一个对象的私有方法被调用,所以我创建一个局部模拟并在私有方法上添加一个期望.

Synchronizer * sync = [[Synchronizer alloc] initWithCleanup:YES];

sync = [OCMockObject partialMockForObject:sync];
[[(id)sync expect] cleanupPreviousContents];      
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,不调用cleanupPreviousContents但测试仍然成功.这个bug在哪里?

问候,昆汀

ocmock

1
推荐指数
1
解决办法
1258
查看次数

OCMock传递任何CGSize

我正在使用OCMock,我正试图在我的一个测试中做到这样的事情:

[[mockScrollView expect] setContentSize:[OCMArg any]];
Run Code Online (Sandbox Code Playgroud)

问题是[OCMArg any]返回一个id类型,我想使用任何类型CGSize,因为我不知道它的确切值.我怎么能通过这个论点?

unit-testing primitive-types ocmock ios cgsize

1
推荐指数
1
解决办法
765
查看次数

OCMock ios7中"NICE""PARTIAL"和"MOCK"的区别

我正在学习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 ios ios7

1
推荐指数
1
解决办法
2128
查看次数

OCMock和Nocilla不兼容吗?

我试图在同一组单元测试中同时使用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不兼容?我似乎无法在任何地方找到一个 - 实际上我已经看到了恰恰相反 - 许多人在同一个测试框架中一直使用它们的例子.所以我必须假设我做错了什么,谁能告诉我什么?

objective-c ocmock nocilla

1
推荐指数
1
解决办法
306
查看次数

OCMock - 试图模拟NSEntityDescription

为了测试托管类,我尝试在单元测试中创建一个实例,首先尝试模拟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

0
推荐指数
1
解决办法
489
查看次数