【发布时间】:2013-04-12 23:00:42
【问题描述】:
我有一个看起来像这样的 Kiwi 规范文件:
#import "Kiwi.h"
#import "MyCollection.h"
SPEC_BEGIN(CollectionSpec)
describe(@"Collection starting with no objects", ^{
MyCollection *collection = [MyCollection new];
context(@"then adding 1 object", ^{
MyObject *object = [MyObject new];
[collection addObject:object];
it(@"has 1 object", ^{
[collection shouldNotBeNil];
[collection.objects shouldNotBeNil];
[[theValue(collection.objects.count) should] equal:theValue(1)]; //failing test
});
context(@"then removing 1 object", ^{
[collection removeObject:object];
it(@"has 0 objects", ^{
[[theValue(collection.objects.count) should] equal:theValue(0)]; //passing test
});
});
});
});
SPEC_END
运行规范导致这行代码出现一次失败[[theValue(collection.objects.count) should] equal:theValue(1)];
这是奇怪的部分 - 如果我从规范中删除整个 context(@"then removing 1 object", ^{...}) 块,则上述测试通过。
这让我相信[collection removeObject:object] 行是在测试失败之前执行的。我感觉我可能误解了块的执行顺序。
任何建议将不胜感激!
【问题讨论】:
-
您不需要在
collection或object上使用__block,因为您不会在任何地方分配给任何一个 -
你是对的 - 我已经编辑了我的问题。当我改变它时,我仍然看到相同的行为。
-
我对 Kiwi 了解不多,但您确定
[collection shouldNotBeNil];是正确的吗?如果collection是nil它只是nop -
shouldNotBeNil是 Kiwi 库的标准部分,但我可以看出它看起来可能会产生误导。请注意,这不是一个普通的方法调用——它实际上是一个宏,最终将期望类型添加到规范对象。所以它实际上并没有将消息传递给潜在的 nil 对象。如果您想仔细查看,可以在这里查看 Kiwi 的所有源代码? - github.com/allending/Kiwi -
另外,您可以取消您的
shouldNotBeNil检查并用更简单的[[collection.objects should] haveCountOf:integer]替换计数检查。haveCountOf:消息不需要使用theValue,您将其传递给一个标量整数。由于should将隐式断言collection.objects不是nil(因此如果collection本身为nil 也会失败),即使在检查计数为零。
标签: ios objective-c bdd objective-c-blocks kiwi