Spring встроил ldap сервер в модульные тесты

"но делает это означает, что должен просто быть пример вида выражения, которое Вы могли использовать, или если это быть фактическим выражением, которое может быть выполнено (оценка и т.д.) для воссоздания объекта? Или... это должно быть просто переиздевательство фактического выражения, которое использовалось в чистых информационных целях?"

, Ничего себе, это - большое заламывание рук.

  1. "пример вида выражения Вы могли использовать", не будет представление конкретного объекта. Это не может быть полезно или значимо.

  2. , Каково различие между "фактическим выражением, которое может... воссоздать объект" и "переиздевательство фактического выражения, которое использовалось [для создания объекта]"? Оба - выражение, которое создает объект. Нет никакого практического различия между ними. Вызов repr мог произвести или новое выражение или исходное выражение. Во многих случаях они - то же.

Примечание, что это не всегда возможно, практично или желательно.

В некоторых случаях, Вы заметите, что repr () представляет строку, которая является ясно не выражение любого вида. Значение по умолчанию repr () для любого класса, который Вы определяете, не полезно как выражение.

В некоторых случаях, Вы могли бы иметь взаимный (или проспект) ссылки между объектами. repr () той запутанной иерархии не может иметь смысла.

Во многих случаях, объект создается инкрементно с помощью синтаксического анализатора. Например, от XML или JSON или чего-то. Каков repr был бы? Исходный XML или JSON? Очевидно не, так как они не Python. Это могло быть некоторое выражение Python, которое генерировало XML. Однако для гигантского XML-документа, не могло бы быть возможно записать единственное выражение Python, которое было функциональным эквивалентом парсинга XML.

9
задан Kent Lai 13 February 2009 в 02:44
поделиться

3 ответа

Разве Spring LDAP не обеспечивает транзакционный контроль над операциями LDAP? Если да, то почему бы не использовать среду тестирования Spring с возможностью автоматического отката?

Я также знаю драйвер моста JDBC-LDAP, который обертывает репозиторий LDAP, представляя его как реляционную базу данных. Я использовал iBatis для подключения к этому (я Я написал об этом на http://lokibear.blogspot.com , см. статьи за июль). Я еще не пробовал применять управление транзакциями, но на веб-сайте драйвера упоминается возможность игнорировать транзакции (что означает, что вы также можете не игнорировать их ... верно?).

Как я уже сказал, я еще не пробовал это; но, если это обеспечивает транзакции вокруг LDAP, вы снова можете использовать тестовую среду Spring, чтобы получить автоматический откат. Я сделал небольшую шпаргалку по этой структуре - см. Сентябрьские сообщения в моем блоге.

Извините, я могу упустить вашу цель здесь; но, возможно, эти предложения полезны. Удачи!

но на веб-сайте драйвера упоминается возможность игнорировать транзакции (что означает, что вы также можете , а не игнорировать их ... верно?).

Как я уже сказал, я еще не пробовал это; но, если это обеспечивает транзакции вокруг LDAP, вы снова можете использовать тестовую среду Spring для автоматического отката. Я сделал небольшую шпаргалку по этой структуре - см. Сентябрьские сообщения в моем блоге.

Извините, я могу упустить вашу цель здесь; но, возможно, эти предложения полезны. Удачи!

но на веб-сайте драйвера упоминается возможность игнорировать транзакции (что означает, что вы также можете , а не игнорировать их ... верно?).

Как я уже сказал, я еще не пробовал это; но, если это обеспечивает транзакции вокруг LDAP, вы снова можете использовать тестовую среду Spring, чтобы получить автоматический откат. Я сделал небольшую шпаргалку по этой структуре - см. Сентябрьские сообщения в моем блоге.

Извините, я могу упустить вашу цель здесь; но, возможно, эти предложения полезны. Удачи!

Я написал небольшую шпаргалку по этой структуре - см. сентябрьские сообщения в моем блоге.

Извините, я могу упустить вашу цель здесь; но, возможно, эти предложения полезны. Удачи!

Я написал небольшую шпаргалку по этой структуре - см. сентябрьские сообщения в моем блоге.

Извините, я могу упустить вашу цель здесь; но, возможно, эти предложения полезны. Удачи!

3
ответ дан 4 December 2019 в 21:12
поделиться

Я только что решил эту проблему. Решение представляет собой комбинацию наблюдателя UIKeyboardDidShowNotification и UIKeyboardDidHideNotification с указанными выше методами textFieldDidBeginEditing: и textFieldDidEndEditing] Вам необходимы: методы. три дополнительных переменных: одна для хранения текущего выбранного поля UITextField (которое я назвал activeField), одна для указания того, было ли перемещено текущее представление, и одна для указания того, отображается ли клавиатура.

Вот как два ] Теперь выглядят методы делегата UITextField :

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    activeField = textField;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    activeField = nil;
    // Additional Code
}

Когда представление загружается, создаются следующие два наблюдателя:

- (void)viewDidLoad {
    // Additional Code
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasHidden:)
                                                 name:UIKeyboardDidHideNotification
                                               object:nil];
}

И соответствующие методы реализуются следующим образом:

- (void)keyboardWasShown:(NSNotification *)aNotification {
    if ( keyboardShown )
        return;

    if ( ( activeField != inputAmount ) && ( activeField != inputAge ) ) {
        NSDictionary *info = [aNotification userInfo];
        NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
        CGSize keyboardSize = [aValue CGRectValue].size;

        NSTimeInterval animationDuration = 0.300000011920929;
        CGRect frame = self.view.frame;
        frame.origin.y -= keyboardSize.height-44;
        frame.size.height += keyboardSize.height-44;
        [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
        [UIView setAnimationDuration:animationDuration];
        self.view.frame = frame;
        [UIView commitAnimations];

        viewMoved = YES;
    }

    keyboardShown = YES;
}

- (void)keyboardWasHidden:(NSNotification *)aNotification {
    if ( viewMoved ) {
        NSDictionary *info = [aNotification userInfo];
        NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
        CGSize keyboardSize = [aValue CGRectValue].size;

        NSTimeInterval animationDuration = 0.300000011920929;
        CGRect frame = self.view.frame;
        frame.origin.y += keyboardSize.height-44;
        frame.size.height -= keyboardSize.height-44;
        [UIView beginAnimations:@"ResizeForKeyboard" context:nil];
        [UIView setAnimationDuration:animationDuration];
        self.view.frame = frame;
        [UIView commitAnimations];

        viewMoved = NO;
    }

    keyboardShown = NO;
}

Теперь этот код работает, как ожидалось. Клавиатура закрывается только при нажатии кнопки Готово, вы можете имитировать соединение LDAP с помощью объекта Mock, который всегда возвращает ожидаемые значения, чтобы можно было завершить другие ваши модульные тесты.

Если вы тестируете соединение LDAP, то вы действительно выполняете интеграционный тест. В этом случае, вероятно, лучше всего подключиться к реальной реализации LDAP.

4
ответ дан 4 December 2019 в 21:12
поделиться

Вы можете знать или не знать, что встроенная функциональность LDAP предоставляется не самим Spring LDAP, а сервером каталогов Apache . К сожалению, загрузчик LDIF в Apache DS (во всяком случае, подключенный Spring) имеет очень плохую обработку ошибок и возможности создания отчетов, и поэтому, вероятно, не будет вести себя так, как вы действительно хотите для модульного теста. Лучше всего, если вы действительно хотите каждый раз начинать с чистого листа, это возглавить модульные тесты Spring Security LDAP и каждый раз повторно инициализировать Apache DS с чистой загрузкой файла LDIF.

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

2
ответ дан 4 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: