Нечетность метода расширения C # во время модульного теста - PullRequest
4 голосов
/ 09 декабря 2008

Использование модульного тестирования Visual Studio 2008 / C # / VS.

У меня есть очень простой метод расширения, который скажет мне, является ли объект определенного типа:

public static bool IsTypeOf<T, O>(this T item, O other)
{
    if (!(item.GetType() is O))
        return false;
    else
        return true;
}

Это будет называться как:

Hashtable myHash = new Hashtable();
bool out = myHash.IsTypeOf(typeof(Hashtable));

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

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

Кто-нибудь сталкивался с этим где-нибудь?

Редактировать: Это упрощенный пример кода. По сути, это самый маленький воспроизводимый пример, который мне удалось создать без багажа окружающего кода. Этот индивидуальный метод также генерирует исключение MissingMethodException при вводе в модульный тест, как описано выше. Код, о котором идет речь, не завершает поставленную задачу, как упоминал Джон, это скорее источник исключения, к которому я сейчас отношусь.

Решение: Я пробовал много разных вещей, соглашаясь с мнением Марка о том, что этот вопрос является справочным. Удаление ссылок, очистка / восстановление, перезапуск Visual Studio не работали. В конечном итоге я закончил поиском скомпилированной DLL на своем жестком диске и удалил ее из любого места, которое не имело смысла. После удаления всех экземпляров, кроме тех, которые находятся в папке TestResults, я смог перестроить и повторно запустить модульные тесты.

Что касается содержания метода, именно в модульном тестировании я обнаружил проблему и так и не смог заставить концепцию работать. Поскольку O - это RunTimeType, у меня нет особого доступа к нему, и я пытался использовать IsAssignableFrom (), чтобы функция возвращалась правильно. В настоящее время эта функция была удалена из моих методов проверки для повторного использования в другое время. Тем не менее, до того, как я это удалил, я все еще получал исходную проблему, которая начинала этот пост многими другими методами.

Пост-решение: Реальный метод был не так сложен, как я его представлял. Вот фактический метод работы:

public static void IsTypeOf<T>(this T item, Type type)
{
    if (!(type.IsAssignableFrom(item.GetType())))
        throw new ArgumentException("Invalid object type");
}

и юнит-тест для его проверки:

[TestMethod]
public void IsTypeOfTest()
{
    Hashtable myTable = new Hashtable();
    myTable.IsTypeOf(typeof(Hashtable));

    try
    {
        myTable.IsTypeOf(typeof(System.String));
        Assert.Fail("Type comparison should fail.");
    }
    catch (ArgumentException)
    { }
}

Ответы [ 2 ]

5 голосов
/ 09 декабря 2008

Обычно MissingMethodException означает, что вы загружаете другую версию dll, отличную от той, на которую вы ссылались во время сборки, и фактическая dll, которую вы загружаете (во время выполнения), не имеет метода, найденного компилятором. (во время компиляции).

Убедитесь, что у вас нет разных версий dll, на которые ссылаются разные проекты. Может случиться так, что когда вы запускаете его в режиме отладки, какой-то другой код сначала загружает правильную dll, но при запуске в контексте этот другой код не запускается - поэтому неверный * Вместо этого загружается версия 1007 *.

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

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

0 голосов
/ 09 декабря 2008

Я размышляю здесь.

Установите ограничение на метод, чтобы посмотреть, поможет ли это Pseudocode</p> <p>public static bool IsTypeOf(this T item, O other) Where T: object, O: Type { }

Кроме того, в каком классе находится этот метод?

РЕДАКТИРОВАТЬ: этот класс, часть сборки, которая тестируется?

...