PexAssert. Бросает в PUT в сочетании с Run Pex. - PullRequest
1 голос
/ 24 февраля 2011

когда я создаю PUT, который вызывает метод тестируемого класса и присваивает ему PexMethod, «Run Pex» будет использовать этот метод и создавать для него автоматически сгенерированные тесты.

Это работает только до тех пор, пока вызов метода находится непосредственно в теле PUT.

Пример:

Это PUT используется "Run Pex":

[PexGenericArguments(typeof(string))]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
[PexMethod]
public string Convert01_ConverterForTypeNotRegistered<T>(
    [PexAssumeUnderTest] ToStringConverter target, T objectToConvert)
{
    var result = "";
    result = target.Convert(objectToConvert);
    return result;
}

Это PUT , а не , используемый "Run Pex":

[PexGenericArguments(typeof(string))]
[PexGenericArguments(typeof(int))]
[PexGenericArguments(typeof(object))]
[PexMethod]
public string Convert01_ConverterForTypeNotRegistered_ThrowsInvalidOperationException<T>(
    [PexAssumeUnderTest] ToStringConverter target, T objectToConvert)
{
    var result = "";
    PexAssert.Throws<InvalidOperationException>(() => target.Convert(objectToConvert));
    return result;
}

Я хочу показать, что вызов метода всегда вызывает это исключение, независимо от параметров.

Как этого добиться?

Я уже задавал этот вопрос неделю назад на официальном форуме Pex от Microsoft , но не получил ни одного ответа, поэтому я делаю двойной пост здесь.

Проблема может быть воспроизведена следующим образом:

  1. Иметь простое решение с одним проектом, одним классом и одним методом.
  2. Щелкните правой кнопкой мыши по этому методу и выберите Run Pex.
  3. В результатах исследования Pex щелкните правой кнопкой мыши по любой записи и выберите «Сохранить тест ...». Он создаст новый тестовый проект с двумя соответствующими файлами: <class-name>Test.cs и <class-name>Test.<MethodName>.g.cs. В первом файле находится PUT, во вторых - конкретные методы тестирования, по одному на каждый параметр, выбранный Pex. Второй файл автоматически воссоздается каждый раз, когда вы запускаете pex для метода с PUT в первом файле.
  4. Щелкните правой кнопкой мыши по тестовому проекту и выберите «Pex» -> «Удалить сгенерированные модульные тесты». Это удалит определенные тесты из второго файла.
  5. Перейдите к файлу с PUT и переименуйте PUT в произвольное имя.
  6. Вернитесь к методу из пункта 1 и снова щелкните правой кнопкой мыши и выберите Run Pex.
  7. Pex создаст новый файл в тестовом проекте с именем `Test..g.cs. Он использует тот же PUT, что и раньше, хотя вы переименовали его.
  8. Измените PUT снова, оставив имя как есть, но изменив содержимое на мой второй пример с PexAssert.Throws.
  9. Снова щелкните правой кнопкой мыши по тестовому проекту и выберите «Pex» -> «Удалить сгенерированные модульные тесты».
  10. Опять же, щелкните правой кнопкой мыши на методе из пункта 1 и выберите «Run Pex»
  11. Откройте оба файла * .g.cs в тестовом проекте, и вы увидите, что тестов нет. Это означает, что Пекс не использовал PUT. Вот в чем проблема:)

1 Ответ

0 голосов
/ 22 марта 2011

Я только что попробовал запустить оба ваших примера в Visual Studio 2010. Я изменил второй пример, чтобы использовать класс с именем ThrowingConverter, и это мои глупые реализации:

public class ToStringConverter {
    internal string Convert(object objectToConvert) {
        return objectToConvert.ToString();
    }
}

public class ThrowingConverter {
    internal string Convert(object objectToConvert) {
        if (objectToConvert is string) {
            return (string)objectToConvert;
        }
        throw new InvalidOperationException();
    }
}

Я запустил Pexи были созданы следующие контрольные примеры:

  • ToStringConverter:
    • int
      • 0
      • 1
    • string
      • null (не работает с NullReferenceException)
      • ""
    • object
      • null (не с NullReferenceException)
      • new object()
  • ThrowingConverter:
    • int
      • 0
    • string
      • null
      • "" (происходит сбой, потому что возвращается "")
    • object
      • null
      • "" (происходит сбойвозвращает "")

Это именно то, что я ожидал найти, поэтому я не вижу вашей проблемы на самом деле.

...