У меня есть файл спецификации 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]
выполняется до неудачного теста. У меня такое чувство, что я могу неправильно понимать порядок, в котором выполняются блоки.
Мы ценим любые предложения!
__block
наcollection
илиobject
, так как вы нигде не назначаете ни одному - person newacct   schedule 13.04.2013[collection shouldNotBeNil];
правильно? еслиcollection
этоnil
то это просто не будет - person Bryan Chen   schedule 13.04.2013shouldNotBeNil
— стандартная часть библиотеки Kiwi, но я вижу, как это может ввести в заблуждение. Обратите внимание, что это не обычный вызов метода — на самом деле это макрос, который в конечном итоге добавляет ожидаемый тип к объекту спецификации. Таким образом, на самом деле это не передача сообщения потенциально нулевому объекту. Вы можете проверить весь исходный код Kiwi здесь, если хотите посмотреть поближе? - github.com/allending/Kiwi - person Barjavel   schedule 13.04.2013shouldNotBeNil
— это специальный макрос, который будет делать правильные вещи. Также обратите внимание, что более типичные макросыshould
иshouldNot
, которые используются для большинства ожиданий киви, неявно устанавливают ожидание того, что субъект на самом деле неnil
(в дополнение к фактическому ожиданию, которое вы настраиваете, например,shouldEqual:something
). - person Mike Mertsock   schedule 15.04.2013shouldNotBeNil
проверки и заменить проверки количества более простыми:[[collection.objects should] haveCountOf:integer]
. СообщениеhaveCountOf:
не требует использованияtheValue
, вы передаете ему скалярное целое число. Посколькуshould
будет неявно утверждать, чтоcollection.objects
не являетсяnil
(и, таким образом, также потерпит неудачу, еслиcollection
само равно nil), можно безопасно сделать это без отдельного утвержденияshouldNotBeNil
, даже если вы проверяете количество нулей. - person Mike Mertsock   schedule 15.04.2013