Скачать вспомогательный метод ФТП


В настоящее время я использую с открытым исходным кодом FTP-сервер библиотеки во всех моих проектах, как мне никогда не удавалось кодекса приличный ФТП вспомогательные библиотеки , основанные на C# 4.0 API-интерфейс.

Что вы думаете о таком подходе? Я не совсем разбираюсь в ТДД, но в идеале я хотел бы сделать этот класс как можно проверить.

public void DownloadFile(string host, string file, string user, string pass, string path)
{
    if (!String.IsNullOrWhiteSpace(host) && !String.IsNullOrWhiteSpace(file))
    {
        Uri addr = new Uri(host + file);

        using (WebClient client = new WebClient())
        {
            if (!String.IsNullOrWhiteSpace(user) && !String.IsNullOrWhiteSpace(pass))
            {
                client.Credentials = new NetworkCredential(user, pass);
            }

            if (!String.IsNullOrWhiteSpace(path))
            {
                client.DownloadFile(addr, path);
            }
        }
    }
}


1395
10
задан 26 апреля 2011 в 07:04 Источник Поделиться
Комментарии
3 ответа

Вот как я бы это сделал, с комментариями!

public void DownloadFile(string host, string file, string user, string pass, string path)
{
// Inverted if-statement to reduce nesting
if (String.IsNullOrWhiteSpace(host)
throw new ArgumentNullException("host");

if(String.IsNullOrWhiteSpace(file))
throw new ArgumentNullException("file");

//Moved path check to forefront because nothing would happen if it's empty
if(String.IsNullOrWhiteSpace(path))
throw new ArgumentNullException("path");

// Changed to UriBuilder. This will handle cases like trailing slashes and whatnot
UriBuilder address = new UriBuilder();
address.Host = host;
address.Path = file;

using (WebClient client = new WebClient())
{
if (!String.IsNullOrWhiteSpace(user) && !String.IsNullOrWhiteSpace(pass))
{
client.Credentials = new NetworkCredential(user, pass);
}

// Changed to a try catch so that we can handle the error with a better message
// If you'd rather have this bubble up, that's fine
try
{
client.DownloadFile(address.Uri, path);
}
catch (Exception e)
{
throw new InvalidOperationException(
"Error downloading file from: " + address.Uri.ToString(),
e)
}
}
}

Я хотел бы также изменить имена переменных как Snowbear ему-компилятор сказал.

Мне нравится держать на самом верху, где самый дешевый-первый охранных условий. Кроме того, предоставление исключений делает его легче для вызывающей стороны, чтобы знать, почему что-то не удалось. Если вы хотите переключить его на логическое успех/неудачу, которая могла бы работать, но не обеспечивает так много информации.

5
ответ дан 27 апреля 2011 в 01:04 Источник Поделиться

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

Метод downloadfile жестко зависимость от WebClient и таким образом на окружающую среду. Он не может быть использован без использования сети и (предположительно) дистанционного обслуживания. Даже если вы решите нажмите на localhost, вам необходимо настроить FTP-сервер на собственной машине, и это считается внешней зависимости, а также. Таким образом, метод не может быть протестированы как есть.

Одним из возможных решений является, чтобы скрыть Вебклиент за соответствующий интерфейс (можно назвать это IWebClient) и ввести ее в класс метод downloadfile.

В целом, однако, такие методы лучше оставить как скромные объекты и, возможно, подвергнут интеграционных тестов.

5
ответ дан 26 апреля 2011 в 08:04 Источник Поделиться

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

2) новый URI(хост + файл); я не думаю, что конкатенация является правильной эксплуатации Ури части, я бы искал что-то вроде пути.Объединить для этой цели. Насколько я Ури(Ури значений параметров baseuri, строковом параметре relativeuri) конструктор будет делать эту работу.

3) Если пользователя и передавать параметры являются необязательными (вы проверяете их быть не NULL), то определить их как необязательные. Это будет более понятно для пользователей, которые будут использовать такой метод, который они могут пропустить пользователя и передавать параметры, если они видят, что это необязательно. В противном случае им придется угадать, будет ли они могут передать значение null или нет.

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

5) я думаю, что вы должны переименовать ваши параметры. У вас путь вместе с файлом , а это не так просто угадать, кто это локальный путь и который является FTP путь. Пройдя путь в конце делает его немного легче угадать, но по-прежнему не хватает. Назовите их remotePath или ftpPath и localPath соответственно.

3
ответ дан 26 апреля 2011 в 09:04 Источник Поделиться