Бросить исключение в методе тестирования с использованием MSTest - PullRequest
0 голосов
/ 02 июля 2018

Я использую MSTest для написания тестовых случаев для моего приложения.
У меня есть метод, где файлы перемещаются из одного каталога в другой каталог. Теперь, когда я запускаю покрытие кода, это показывает, что блок catch не покрывается покрытием кода.
Это мой код, как показано ниже.

class Class1
    {
        public virtual bool MoveFiles( string fileName)
        {
            bool retVal = false;
            try
            {
                string sourcePath = "PathSource";
                string destinationPath = "DestPath";
                if (Directory.Exists(sourcePath) && Directory.Exists(destinationPath))
                {
                    string finalPath = sourcePath + "\\" + fileName ;
                    if (Directory.Exists(finalPath))
                    {
                        File.Move(finalPath, destinationPath);
                        retVal = true;
                    }
                }
            }
            catch (Exception ex)
            {
                LogMessage("Exception Details: " + ex.Message);
                retVal = false;
            }
            return retVal;
        }
    }

Метод тестирования для приведенного выше кода таков.

[TestMethod()]
    public void MoveFilesTest()
    {
        string filename = "test";
        Class1 serviceObj = new Class1();
        var result = serviceObj.MoveFiles(filename);
        Assert.IsTrue(result);
    }

Когда я запускаю покрытие кода, оно показывает, что покрыт только блок try, а не блок catch. Поэтому для этого мне нужно написать другой метод тестирования и сгенерировать исключение, и метод тестирования будет выглядеть примерно так.

[TestMethod()]
    public void MoveFilesTest_Exception()
    {
        string filename = "test";
        Class1 serviceObj = new Class1();
        ExceptionAssert.Throws<Exception>(() => serviceObj.MoveFiles(filename));
    }

Может ли кто-нибудь помочь создать исключение для этого кода, поскольку я не смог этого сделать или, по крайней мере, указать мне, как это сделать?
Большое спасибо!

1 Ответ

0 голосов
/ 02 июля 2018

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

Следующий код будет проверять наличие недопустимых символов в имени файла и должен вызывать ArgumentException, поскольку > является недопустимым символом в именах файлов:

[TestMethod]
[ExpectedException(typeof(ArgumentException))]
public void InvalidCharacterInFileNameTest()
{
    string filename = "test>";
    Class1 serviceObj = new Class1();
    serviceObj.MoveFiles(filename);
}

Обновление:

Поскольку Directory.Exists() 'подавляет' любое исключение, которое может произойти, вам также нужно изменить код в вашей функции, чтобы выдать исключение, если исходный файл не существует или недействителен.

Это всего лишь пример, показывающий, как его можно реализовать, но ваш код может выглядеть примерно так:

public virtual bool MoveFiles(string fileName)
{
    bool retVal = false;
    try
    {
        string sourcePath = "PathSource";
        string destinationPath = "DestPath";
        if (Directory.Exists(sourcePath) && Directory.Exists(destinationPath))
        {
            string finalPath = sourcePath + "\\" + fileName;
            if (Directory.Exists(finalPath))
            {
                File.Move(finalPath, destinationPath);
                retVal = true;
            }
            else
            {
                throw new ArgumentException("Source file does not exists");
            }
        }
    }
    catch (Exception ex)
    {
        LogMessage("Exception Details: " + ex.Message);
        retVal = false;
    }
    return retVal;
}
...