NUnit проверить, что свойство является коллекцией - PullRequest
0 голосов
/ 27 ноября 2010

Вопрос, связанный с TDD.

Я могу проверить, что свойство Years равно List<int>:

Assert.IsInstanceOf<List<int>>(viewModel.Years);

Но Years может быть List<int> или объектом, содержащим List<int>.

Например,

public class ViewModel
{
   public List<int> Years {get;set;}
   or 
   public object Years {get;set;}
}

Я спрашиваю об этом, потому что при кодировании VS генерирует свойство Years объекта типа.

Одним из возможных решений может быть:

Assert.AreEqual(yearsList, (List<int>)viewModel.Years);

Когда я буду генерировать Годы, он будет иметь тип List<int>.

Существуют ли другие способы обеспечения того, чтобы Годыимеет правильный тип?

Ответы [ 3 ]

2 голосов
/ 28 ноября 2010

Обойдя вопрос о том, стоит ли вам даже проверять это, как минимум, вместо того, чтобы проверять, что Years является List<int>, вы должны проверять, что это IList<int>.Во-вторых, тебе действительно нужно что-то такое сильное?Можете ли вы уйти с ICollection<int> или IEnumerable<int>.Вы должны тестировать самый слабый тип, который вам нужен.

Тогда я бы сказал:

static class ObjectExtensions {
    public static bool Implements(this object o, Type type) {
        Contract.Requires<ArgumentNullException>(o != null);
        Contract.Requires<ArgumentNullException>(type != null);
        Contract.Requires<ArgumentException>(type.IsInterface);
        return o.GetType()
                .GetInterfaces()
                .Contains(type);
    }
}

Использование:

[Test]
public void Years_is_an_object_that_implements_ilist_int() {
    // viewModel is ViewModel
    Assert.IsNotNull(viewModel.Years);
    Assert.AreEqual(true, viewModel.Years.Implements(typeof(IList<int>));
}
1 голос
/ 27 ноября 2010

Лучшее решение для меня это:

Assert.IsTrue(viewModel.Years is List<int>)

, но оно не работает :( даже в resharper

работает и выглядит красиво только так:

Assert.IsNotNull(viewModel.Years as List<int>)

FYI
ReSharper также недостаточно умен, чтобы определить правильный тип.

0 голосов
/ 28 ноября 2010

Я взял лучшее из обоих ответов:

Мое решение

namespace Tests
{
    public class AssertExt
    {
        public static void IsOfType<T>(T entity) 
        {
        }


        public static void IsOfType<T>(T entity, string message) 
        {
        }
    }
}

Теперь я могу написать что-то вроде этого:

AssertExt.IsOfType<Dictionary<int, string>>(viewModel.PrintFor);

И VS создаст свойствоправильного типа.

К сожалению, я не могу создать расширение для класса Assert NUnit.

Я не знаю, почему оно не позволяет мне иметь что-то вроде

Assert.IsOfType<Dictionary<int, string>>(viewModel.PrintFor);

Может быть, проблема в защищенном конструкторе Assert?

...