0

我正在使用 Kiwi 框架通过 Magical Record 库测试我的代码和 Core Data 之间的交互。神奇的记录在NSManagedObject上定义了一个category,增加了几个不错的方法,比如MR_createInContext:(NSManagedObjectContext *)context。我正在尝试测试是否调用了该方法以及调用了多少次。

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"];
});

问题是 Kiwi 似乎没有看到该类别,尽管

#import <CoreData+MagicalRecord.h>

在测试 .m 文件中。

ME_ShouldCreateNewObjectForMeObjectWithNewId (EHMeSpecs) failed: 'ME, should create new object for me object with new id' [FAILED], cannot stub -MR_createInContext: because no such method exist

如何让 Kiwi 了解该类别?

4

2 回答 2

0

查看您的测试名称,我猜您的意图是验证 Core Data 是否有效,为您创建一个新的托管对象并具有正确的 ObjectID。我认为不需要知道 Kiwi 现在应该如何拦截类别等。我会像这样简单地编写您的测试:

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")));
});

不要担心测试类别是否有效,因为通过这个测试,无论如何它都会隐含地测试它。如果此测试失败,您很快就会知道该类别不起作用。

我的测试规则之一是“不要测试语言或框架”。当您测试某个类别是否有效时,您违反了此规则并测试了其他人很可能已经测试过的东西。

于 2013-05-02T21:24:43.883 回答
0

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

于 2013-05-02T21:33:57.747 回答