Kiwi + MagicalRecord 方法不存在

Posted

技术标签:

【中文标题】Kiwi + MagicalRecord 方法不存在【英文标题】:Kiwi + MagicalRecord method does not exist 【发布时间】:2013-05-02 20:59:04 【问题描述】:

我正在使用 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: 因为不存在这样的方法

如何让 Kiwi 了解该类别?

【问题讨论】:

【参考方案1】:

查看您的测试名称,我猜您的意图是验证 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")));
);

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

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

【讨论】:

该方法要么创建一个新的,要么返回一个获取的对象。有必要测试一下,因为我想确认第一次看到对象时,它会被创建,并且不会返回 nil。因此 MR_createInContext 将被获取。顺便说一句,我发现了错误,此方法是在 NSManagedObject 而不是上下文中定义的。 MR_createInContext 将被调用*【参考方案2】:

显然这个方法是在 NSManagedObject 而不是 NSManagedObjectContext 上定义的,它应该说 [[Me class] should] receive... My bad.

【讨论】:

以上是关于Kiwi + MagicalRecord 方法不存在的主要内容,如果未能解决你的问题,请参考以下文章

尝试将 Magical Record 与 Kiwi 一起使用时构建测试时出错

使用 Kiwi、Core Data 和 Magical Record 进行单元测试

XCode 7 XCTest(Kiwi) +加载类别方法调用了两次

如何在 Kiwi 中为模拟方法设置参数期望

在并发 NSOperation (MagicalRecord-2.3) 中使用 MagicalRecord 的正确方法

MagicalRecord 调用多个保存方法