BDD в Objective-C - PullRequest
       20

BDD в Objective-C

27 голосов
/ 23 августа 2009

Я недавно начал изучать Objective-C и писать свои тесты, используя OCUnit, который поставляется в комплекте с Xcode.

Я давний программист на Ruby и привык к RSpec и Cucumber - хорошим BDD-фреймворкам.

Есть ли приличная структура BDD для использования в Objective-C? Я скучаю по своему "должен" :) 1005 *

Ответы [ 6 ]

21 голосов
/ 28 января 2011

Я использую Библиотека киви Быстрая интеграция, работает довольно хорошо.

С их Github :

describe(@"Team", ^{
    context(@"when newly created", ^{
        it(@"should have a name", ^{
            id team = [Team team];
            [[team.name should] equal:@"Black Hawks"];
        });

        it(@"should have 11 players", ^{
            id team = [Team team];
            [[[team should] have:11] players];
        });
    });
});
17 голосов
/ 24 августа 2009

Существует относительно новый проект под названием uispec , который был вдохновлен тестированием DSL RSpec. Пример спецификации выглядит следующим образом:

#import "DescribeEmployeeAdmin.h"
#import "SpecHelper.h"

@implementation DescribeEmployeeAdmin

-(void)before {
  //login as default admin before each example
  [SpecHelper loginAsAdmin];
}

-(void)after {
  //logout after each example
  [SpecHelper logout];
}

-(void)itShouldHaveDefaultUsers {
  //Check that all default users are in list
  [[app.tableView.label text:@"Larry Stooge"] should].exist;
  [[app.tableView.label text:@"Curly Stooge"] should].exist;
  [[app.tableView.label text:@"Moe Stooge"] should].exist;
}

-(void)itShouldAddAUser {
  //Click the + button
  [app.navigationButton touch];

  //Set the form fields.
  //Also ".with" is optional so we here we can show the different syntax
  [[app.textField.with placeholder:@"First Name"] setText:@"Brian"];
  [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"];
  [[app.textField.with placeholder:@"Email"] setText:@"b@g.com"];
  [[app.textField placeholder:@"Username"] setText:@"bkuser"];
  [[app.textField placeholder:@"Password"] setText:@"test"];
  [[app.textField placeholder:@"Confirm"] setText:@"test"];

  //Click the Save button
  [[app.navigationButton.label text:@"Save"] touch];

  //Make sure the error alert view doesn't appear
  [app timeout:1].alertView.should.not.exist;

  //User list should now have a new entry
  [[app.tableView.label text:@"Brian Knorr"] should].exist;
}

@end

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

14 голосов
/ 06 июля 2010

Адам Миллиган из Pivotal Labs создал BDD-фреймворк для Objective-C под названием Cedar , который нацелен как на Какао, так и на Какао Touch. Он использует блоки аналогично RSpec. Вот пример спецификации:

SPEC_BEGIN(FooSpecs)

sharedExamplesFor(@"a similarly-behaving thing", ^(NSDictionary *context) {
    it(@"should do something common", ^{
        ...
    });
});

NSDictionary *context = [NSDictionary dictionary];

describe(@"Something that shares behavior", ^{
    itShouldBehaveLike(@"a similarly-behaving thing", context);
});

describe(@"Something else that shares behavior", ^{
    itShouldBehaveLike(@"a similarly-behaving thing", context);
});

SPEC_END
8 голосов
/ 24 августа 2009

Посмотрите, как реализованы макросы STAssert в OCUnit (SenTestingKit, входит в Xcode).

В вашем собственном модульном тестовом пакете вы могли бы реализовать категорию на NSObject, чтобы добавить методы, подобные гипотетическому -shouldBeValid, которые затем вызывали бы тот же механизм прохода / неудачи, что и макросы STAssert сейчас.

Если вы не очень хорошо знакомы с препроцессором C ...

Возможно, вам также придется использовать #define для ваших макросов, чтобы пройти правильные значения для __FILE__ и __LINE__, когда ваши тесты BDD не пройдены. Например, вам может потребоваться сделать что-то вроде этого:

@interface NSObject (BehaviorDrivenDevelopment)
- (void)shouldBeValidInFile:(const char *)file line:(int)line;
@end

#define shouldBeValid  shouldBeValidInFile:__FILE__ line:__LINE__

Таким образом, вы бы вызвали это так:

[[someObject methodUnderTest:argument] shouldBeValid];

Код, который видит компилятор, будет таким:

[[someObject methodUnderTest:argument] shouldBeValidInFile:__FILE__ line:__LINE__];

Макросы препроцессора __FILE__ и __LINE__ будут расширены до текущего файла и строки в исходном файле теста.

Таким образом, когда у вас есть провальный тест, он может передать соответствующую информацию SenTestingKit для отправки обратно в Xcode. Ошибка будет правильно отображаться в окне «Результаты сборки», и, нажав на нее, вы перейдете к точному местоположению ошибки в ваших тестах.

3 голосов
/ 16 ноября 2012

Вы можете взглянуть на BDD От идеи до приложения , где вы увидите пример использования калебаса.

0 голосов
/ 23 августа 2009

Ничто не помешает вам добавить префикс к методу тестирования. Я сделал это с NUnit в C #.

...