2013-05-02 67 views
0

我使用Kiwi框架通过Magical Record库来测试我的代码和Core Data之间的交互。神奇记录在NSManagedObject上定义了一个类别,它添加了一些不错的方法,比如MR_createInContext:(NSManagedObjectContext *)上下文。我试图测试是否这个方法被调用,并且被调用了多少次。Kiwi + MagicalRecord方法不存在

it(@"should create new object for me object with new id", ^{ 
    [[[NSManagedObjectContext MR_contextForCurrentThread] should] receive:@selector(MR_createInContext:)]; 
    Me *me = [Me meWithID:@"12345" inContext:[NSManagedObjectContext MR_contextForCurrentThread]]; 
    [me shouldNotBeNil]; 
    [[me.idNumber should] equal:@"12345"]; 
}); 

的问题是,猕猴桃似乎并没有看到该类别尽管

#import <CoreData+MagicalRecord.h> 
测试.m文件

ME_ShouldCreateNewObjectForMeObjectWithNewId(EHMeSpecs)失败,“我,我,应该创建新的对象,我用新的ID对象” [失败],不能存根-MR_createInContext:因为没有这样的方法存在

我怎样才能使猕猴桃知道的类别?

回答

0

显然这个方法是在NSManagedObject上定义的,而不是NSManagedObjectContext,它应该说[[Me class]应该]接收...我的不好。

0

看着你的测试的名字,我猜你的意图是验证Core Data的工作原理,为你创建一个新的托管对象并拥有一个合适的ObjectID。我不认为有必要知道猕猴桃现在应该如何拦截这个类别。我只想写你的测试,像这样:

it(@"should create a new object", ^{ 

    NSManagedObjectContext *testContext = [NSManagedObjectContext MR_context]; 
    id myObject = [MyEntity createWithStuff:@{...} inContext:testContext]; 

    assertThat(myObject, isNot(nil)); 
    assertThat([myObject someAttrbiute], is(equalTo(@"some value"))); 
}); 

不要担心,如果测试类的作品,因为这个测试,它的测试隐含无论如何都。如果此测试中断,您将很快知道该类别无法正常工作。

我的一个测试规则是“不要测试语言或框架”。当你测试一个类别是否有效时,你违反了这个规则并且测试了其他人最有可能测试过的东西。

+0

该方法创建一个新的或返回一个提取的对象。有必要测试一下,因为我想确认第一次看到该对象时,它将被创建,并且nil不会被返回。因此MR_createInContext将被提取。顺便说一句,我发现错误,这种方法是在NSManagedObject而不是上下文上定义的。 – foFox 2013-05-02 21:29:06

+0

MR_createInContext将被调用* – foFox 2013-05-02 21:35:49