Подтвердить что ты не робот

BDD в Objective-C

Недавно я начал изучать Objective-C и писать свои тесты с помощью OCUnit, поставляемого в комплекте с Xcode.

Я долго программист Ruby, и я привык к RSpec и Cucumber - хорошие рамки BDD.

Есть ли достойная база BDD для использования в Objective-C? Я пропустил свой "должен:)

4b9b3361

Ответ 1

Там был относительно новый проект под названием uispec, который был вдохновлен RSL-тестированием DSL. Пример spec выглядит следующим образом:

#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:@"[email protected]"];
  [[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

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

Ответ 2

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

От их 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];
        });
    });
});

Ответ 3

Адам Миллиган из Pivotal Labs создал структуру BDD для Objective-C, называемую Cedar, которая нацелена как на Cocoa, так и на Cocoa Нажмите. Он использует блоки аналогично 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

Ответ 4

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

В вашем собственном пакете unit test вы можете реализовать категорию на NSObject, чтобы добавить методы, такие как гипотетический -shouldBeValid, который затем будет вызывать те же машины pass/fail, что и макросы 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. Ошибка будет отображаться правильно в окне "Результаты сборки", и нажатие на нее приведет вас к точному местоположению сбоя в ваших тестах.

Ответ 6

Нет ничего, что помешало бы вам префикс вашего тестового метода с помощью функции "Должен". Я сделал это с помощью NUnit в С#.