2014-01-27 4 views
0

Я ищу способ проверить свойства вложенных объектов. По сути, у меня есть спецификация, которая проверит результат, который мы получаем от внешней службы. Поскольку я не хочу делать gazillion звонки в службу для каждого примера, который я хочу протестировать, запрос делается один раз в начале спецификации, а затем мы представляем набор ожиданий, проверяющих ответ.Kiwi: Есть ли способ иметь динамическое число примеров, определяемое переменной времени выполнения?

Лучший объяснил с образцом кода (который не работает должным образом, очевидно):.

beforeAll(^{ 
     wait = [self waitFor:^(id handler) { [session.account all:handler]; }]; 
     accounts = wait.result; 
    }); 

    it(@"should make a successfull request", ^{ 
     [[wait should] beSuccessful]; 
    }); 

    it(@"returns a non-nil list of accounts", ^{ 
     [[accounts shouldNot] beNil]; 
    }); 

    it(@"should have at least 1 account", ^{ 
     [[[accounts.accounts should] haveAtLeast:1] account]; 
    }); 

    context(@"each account", ^{ 
     for (Account* account in accounts.accounts) { 
      it(@"should have a name", ^{ 
       [[account.name shouldNot] beEmpty]; 
      }); 
      it(@"should have an accountID", ^{ 
       [[account.accountID shouldNot] equal:@"bla"]; 
      }); 
     } 
    }); 
}); 

Это «каждый счет» контекст Я заинтересован в принципе, вызов возвращает набор и я хочу, чтобы каждый из них имел силу.

Я мог бы обернуть это и иметь петли в блоках it(), и этот вид работает, но он не говорит мне, какой элемент был неисправен, и все верификаторы работают после неисправного (например, при встрече в nil account.name) возвращает ошибку Trying to add another verifier without specifying a matcher for the previous one.. Так что, не очень полезно.

Я думал о просто проверке возвращенного json, потому что есть также набор спецификаций, которые мы имеем для (unit-) тестирования наших собственных компонентов независимо от ответа, который мы получаем от службы. Но это не сработает, так как мы не очень заботимся о точном наборе данных (что также подвержено изменениям), просто формат должен быть правильным.

При написании спецификации с локальными testdata, я бы написал несколько спецификаций для каждого уровня в иерархии, но я хочу, чтобы это было вместе: я хотел бы протестировать один ответ, полученный от сервера, в полном объеме.

Я попытался сделать это динамически, добавив больше KWExamples, когда тест запущен, но это, похоже, не работает.

Любая идея (или я неправильно ее использую для чего-то, чего она не предназначалась)?

(также размещены как вопрос Github: https://github.com/allending/Kiwi/issues/435)

ответ

1

Каждая спецификация должна быть уникальное имя. В вашем примере вы добавляете спецификации x с тем же именем. Я думаю, что лучше иметь только 2 спецификации. Просто перебирайте массив в обоих:

context(@"each account", ^{ 
    it(@"should have a name", ^{ 
     for (Account* account in accounts.accounts) { 
      [[account.name shouldNot] beEmpty]; 
     } 
    }); 
    it(@"should have an accountID", ^{ 
     for (Account* account in accounts.accounts) { 
      [[account.accountID shouldNot] equal:@"bla"]; 
     } 
    }); 
}); 
+0

Ну, конечно, но тогда мы тестируем несколько вещей в одной спецификации, и становится трудно узнать, какой из них терпит неудачу. – Inferis