Что хороший путь состоит в том, чтобы перезаписать DateTime. Теперь во время тестирования?

Эта библиотека: Android-Image-Cropper очень эффективна для CropImages.

Вы обрезаете свои изображения несколькими строками кода.

1 - добавьте зависимости в buid.gradle (Module: app)

compile 'com.theartofdev.edmodo:android-image-cropper:2.7.+'

2 - Добавить разрешения в AndroidManifest.xml



3 - Добавить CropImageActivity в AndroidManifest.xml


4 - Запустить в зависимости от ваших требований.

// start picker to get image for cropping and then use the image in cropping activity
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.start(this);

// start cropping activity for pre-acquired image saved on the device
CropImage.activity(imageUri)
.start(this);

// for fragment (DO NOT use `getActivity()`)
CropImage.activity()
.start(getContext(), this);

5 - Получить результат в onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
    CropImage.ActivityResult result = CropImage.getActivityResult(data);
    if (resultCode == RESULT_OK) {
      Uri resultUri = result.getUri();
    } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
      Exception error = result.getError();
    }
  }
}

Вы можете выполнить несколько настроек , в соответствии с настройкой соотношения сторон или формы для RECTANGLE, OVAL и многое другое.

109
задан Alex B 7 November 2008 в 22:42
поделиться

8 ответов

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

interface IClock
{
    DateTime Now { get; } 
}

С конкретной реализацией

class SystemClock: IClock
{
     DateTime Now { get { return DateTime.Now; } }
}

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

class StaticClock: IClock
{
     DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}

могут быть немного служебные в обеспечении часов к классу, который полагается на него, но это могло быть обработано любым количеством решений для внедрения зависимости (использующий Инверсию контейнера Управления, простую инжекцию конструктора/метода set, или даже Статический Шаблон Шлюза ).

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

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

149
ответ дан Blair Conrad 5 November 2019 в 10:11
поделиться

Использование Ayende Rahien статический метод, который довольно прост...

public static class SystemTime
{
    public static Func<DateTime> Now = () => DateTime.Now;
}
55
ответ дан Anthony Mastrean 5 November 2019 в 10:11
поделиться

Я думаю, создавая отдельный класс часов для чего-то простого как получение текущей даты, немного излишества.

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

17
ответ дан Mendelt 5 November 2019 в 10:11
поделиться

Ключ к успешному поблочному тестированию разъединение . Необходимо разделить интересный код от его внешних зависимостей, таким образом, он может быть протестирован в изоляции. (К счастью Разработка через тестирование производит разъединенный код.)

В этом случае, Вашим внешним является текущий DateTime.

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

11
ответ дан Jay Bazuzi 5 November 2019 в 10:11
поделиться

Вы могли ввести класс (лучше: метод / делегат ), Вы используете для DateTime.Now в протестированном классе. Имейте DateTime.Now быть значением по умолчанию и только установить его в тестировании к фиктивному методу, который возвращает постоянную величину.

РЕДАКТИРОВАНИЕ: , Что сказал Blair Conrad (у него есть некоторый код для взгляда на). Кроме, я склонен предпочитать делегатов к этому, поскольку они не загромождают Вашу иерархию классов с материалом как IClock...

2
ответ дан Daren Thomas 5 November 2019 в 10:11
поделиться

Вы рассмотрели использование условной компиляции для управления тем, что происходит во время отладки/развертывания?

, например,

DateTime date;
#if DEBUG
  date = new DateTime(2008, 09, 04);
#else
  date = DateTime.Now;
#endif

Сбой, что, Вы хотите представить свойство, таким образом, можно управлять им, это - вся часть проблемы записи тестируемый код, который является чем-то, что я в настоящее время борюсь сам: Редактирование D

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

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

-11
ответ дан Community 5 November 2019 в 10:11
поделиться

Я бы предложил использовать idisposable Pattern:

[Test] 
public void CreateName_AddsCurrentTimeAtEnd() 
{
    using (Clock.NowIs(new DateTime(2010, 12, 31, 23, 59, 00)))
    {
        string name = new ReportNameService().CreateName(...);
        Assert.AreEqual("name 2010-12-31 23:59:00", name);
    } 
}

подробно описано здесь: http://www.lesnikowski.com/blog/index.php/testing-dateTime-now/

4
ответ дан 24 November 2019 в 03:20
поделиться

Еще один, использующий Microsoft Moles ( каркас изоляции для .NET ).

MDateTime.NowGet = () => new DateTime(2000, 1, 1);

Moles позволяет заменить любой метод .NET делегатом. Moles поддерживает статические и невиртуальные методы. Moles полагается на профилировщик от Pex.

10
ответ дан 24 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

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