Изучение TDD на простом примере

enter image description here

3 Методы изменения имени пакета в Android Studio

Я думаю, что это новое. Я попробовал это, и это работает. Если выше, не работает для вас. Попробуй это. На сайте, о котором я упоминал выше, есть еще 2 метода с обучающей программой. Я также проверил.

Сначала я собираюсь поговорить об изменении имени пакета. В этом примере мы изменим имя пакета «com.androidride.myapplication» на «info.xyz.yourapplication».

  1. Щелкните правой кнопкой мыши по имени пакета, который вы хотите изменить, и выберите Рефакторинг -> Переместить .
  2. Появится новое диалоговое окно, выберите Переместите пакет «com.androidride.myapplication» в другой пакет и нажмите Ok .
  3. Появится диалоговое окно с предупреждением, нажмите да .
  4. Введите новое имя пакета в новом диалоговом окне. Но только «info.xyz» покидает ваше приложение.
  5. Теперь вы увидите диалоговое окно с предупреждением о том, что пакет info.xyz не существует. Вы хотите создать это? нажмите Да .
  6. Нажмите « Do Refactor» . Теперь имя вашего пакета изменилось на info.xyz.myapplication .
  7. Щелкните правой кнопкой мыши по info.xyz.myapplication и Refactor -> Rename .
  8. Нажмите Переименовать пакет .
  9. Диалоговое окно переименования: измените myapplication на yourapplication .
  10. Нажмите Do refactor .
  11. Удалите старые каталоги с именами пакетов и измените идентификатор приложения в build.gradle , измените его на info.xyz.yourapplication .
  12. Вот и все.

23
задан Carl Manaster 9 December 2010 в 15:52
поделиться

2 ответа

Я бы начал с размышлений о сценариях для каждого шага вашей программы, начиная со сбоев и их ожидаемого поведения:

  • Пользователь предоставляет нулевое местоположение файла CSV (бросает ArgumentNullException).

  • Пользователь указывает местоположение пустого файла CSV (выбрасывает ArgumentException).

  • CSV-файл, указанный пользователем, не существует (что вы считаете подходящим).

Далее, напишите тест для каждого из этих сценариев и убедитесь, что он не работает. Затем напишите достаточно кода, чтобы пройти тест. Это довольно легко для некоторых из этих условий, потому что код, который делает ваш тестовый проход, часто является окончательным кодом:

public class Merger { 
    public void Merge(string csvPath, string templatePath, string outputPath) {
        if (csvPath == null) { throw new ArgumentNullException("csvPath"); }
    }
}

После этого перейдите к стандартным сценариям:

  • Указанный CSV-файл имеет одну строку (слияние должно быть вызвано один раз, вывод записан в ожидаемом месте).

  • Указанный CSV-файл состоит из двух строк (слияние должно вызываться дважды, вывод записывается в ожидаемое место).

  • Имя выходного файла соответствует вашим ожиданиям (какими бы они ни были).

И так далее. Как только вы дойдете до этого второго этапа, вы начнете определять поведение, которое хотите заглушить и высмеять. Например, проверка того, существует файл или нет - .NET не позволяет легко заглушить это, поэтому вам, вероятно, потребуется создать интерфейс и класс адаптера, которые позволят вам изолировать вашу программу от реальной файловой системы (для не говоря уже о реальных файлах CSV и шаблонах слияния). Доступны и другие методы, но этот метод довольно стандартный:

public interface IFileFinder { bool FileExists(string path); }

// Concrete implementation to use in production
public class FileFinder: IFileFinder {
    public bool FileExists(string path) { return File.Exists(path); }
}

public class Merger {
    IFileFinder finder;
    public Merger(IFileFinder finder) { this.finder = finder; }
}

В тестах вы пройдете реализацию заглушки:

[Test]
[ExpectedException(typeof(FileNotFoundException))]
public void Fails_When_Csv_File_Does_Not_Exist() {

    IFileFinder finder = mockery.NewMock<IFileFinder>();
    Merger      merger = new Merger(finder);
    Stub.On(finder).Method("FileExists").Will(Return.Value(false));

    merger.Merge("csvPath", "templatePath", "outputPath");
}
34
ответ дан 29 November 2019 в 01:57
поделиться

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

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

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

Я бы порекомендовал поиграть с насмешками Rhino и просмотреть примеры в документации, чтобы понять, как это работает.

http://ayende.com/projects/rhino-mocks.aspx

2
ответ дан 29 November 2019 в 01:57
поделиться
Другие вопросы по тегам:

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