Visual Studio 2010 и разработка через тестирование

Я делаю свои первые шаги в Разработке через тестирование с Visual Studio. У меня есть некоторые вопросы относительно того, как реализовать универсальные классы с VS 2010.

Во-первых, скажем, я хочу реализовать свою собственную версию ArrayList. Я запускаю путем создания следующего теста (я использую в этом случае MSTest):

[TestMethod]
public void Add_10_Items_Remove_10_Items_Check_Size_Is_Zero() {
    var myArrayList = new MyArrayList<int>();

    for (int i = 0; i < 10; ++i) {
        myArrayList.Add(i);
    }

    for (int i = 0; i < 10; ++i) {
        myArrayList.RemoveAt(0); //should this mean RemoveAt(int) or RemoveAt(T)?
                                 //VS doesn't know. Any work arounds?
    }

    int expected = 0;
    int actual = myArrayList.Size;
    Assert.AreEqual(expected, actual);
}

Я использую способность VS 2010 совершить нападки

ctrl +.

и имейте его классы/методы реализации на движении.

  1. Я получал некоторую проблему при реализации универсальных классов. Например, когда я определяю .Add(10) метод, VS не знает, предназначаю ли я общий метод (поскольку класс универсален), или Add(int number) метод. Там какой-либо путь состоит в том, чтобы дифференцировать это?
  2. То же может произойти с типами возврата. Давайте предположим, что я реализую a MyStack стек и я хотим протестировать, если после того, как я продвигаю и элемент и выталкиваю его, стек все еще пуст. Все мы знаем, что поп должен возвратить что-то, но обычно, код этого теста не должен заботиться о нем. Visual Studio затем думала бы, что поп является пустым методом, который на самом деле не является тем, что можно было бы хотеть. Как иметь дело с этим? Для каждого метода я должен запустить путем создания тестов, которые "очень конкретны" те, которые очевидны, что метод должен возвратить что-то так, что я не получаю этот вид неоднозначности? Даже если, не используя результат, должен я иметь что-то как int popValue = myStack.Pop() ?
  3. Как я должен сделать тесты к универсальным классам? Только тест с одним универсальным видом типа? Я использовал ints, поскольку они просты в использовании, но я должен также протестировать с различными видами объектов? Как Вы обычно приближаетесь к этому?
  4. Я вижу, что существует популярный инструмент под названием TestDriven для.NET. С выпуском VS 2010 это все еще полезно, или большим количеством его функций является теперь часть VS 2010, представляя его довольно бесполезный?
  5. Каждый раз, когда я определяю новое свойство в своем тестовом коде и прошу, чтобы VS генерировал тот тупик метода для меня, это генерирует и метод считывания и метод set. Если у меня есть что-то как int val = MyClass.MyProperty я хотел бы, чтобы понять, что (по крайней мере все же) я только хочу определить метод считывания.

Спасибо

6
задан devoured elysium 16 May 2010 в 17:48
поделиться

2 ответа

Зачем в вашем примере кода использовать метод RemoveAt (T obj) ?

Вы можете использовать RemoveAt (int index) и Remove (T obj) вместо этого. Взгляните на API Microsoft (например, для List ), которые показывают, как они настраивают методы Remove для общей коллекции.

А теперь о ваших точках:

1: Что бы Add (int number) сделал? Если я правильно понимаю ваши намерения, Добавить (10) можно интерпретировать только как «Добавить значение 10 в конец моей коллекции». Если вы хотите добавить значение по определенному индексу, вы можете (и, вероятно, должны) назвать этот метод Insert: Insert (int index, T value) .

2: конечно, Visual Studio сначала интерпретирует метод как недействительный, но вы можете изменить его так, чтобы он выглядел как

public class MyStack<T>
{
    public T Pop() 
    {
    }
}

Заглушки, созданные нажатием Ctrl +. - это удобство, но не евангелие. Вы НЕ ДОЛЖНЫ всегда присваивать возвращаемое значение переменной. Если вам это не нужно в тесте, не делайте этого. Если вы хотите, чтобы VS выбирал тип возвращаемого значения, отличный от void, вы можете написать другой модульный тест (например, что Pop () возвращает последнее отправленное значение).

3: Я бы тестировал типы, которые чаще всего используются в моем коде. Если вы пишете общедоступный API, протестируйте как можно больше типов. Если вы используете NUnit, попробуйте использовать атрибут [TestCase] ​​, чтобы избежать написания повторяющегося кода.

4: Я все еще использую TestDriven, но я не пробовал обойтись без него, поэтому я не могу провести полезное сравнение.

5: Просто удалите сеттер, если он вам не нужен. Некоторые фреймворки надстроек, такие как ReSharper , поддерживают более продвинутую генерацию кода, включая свойства только для чтения.

3
ответ дан 17 December 2019 в 02:25
поделиться

Я вижу, что существует популярный инструмент под названием TestDriven for .NET. После выхода VS 2010 он все еще полезен, или многие его функции теперь являются частью VS 2010, делая его вроде как бесполезным?

Он все еще полезен, если вы используете один из нескольких различных фреймворков модульного тестирования (nunit, mbunit, xunit, csunit и т.д.).

Существуют и другие инструменты (например, Visual Nunit), которые обеспечивают интеграцию с visual studio для выполнения модульных тестов.

3
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

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