2015-10-12 5 views
4

У меня есть класс, который содержит двухмерный массив другого объекта. Он имеет один конструктор, но внутри этот массив инициализируется всегда нулями. Таким образом, Others не инициализируется быть справедливым:Должен ли я создавать новый конструктор только для тестовых целей?

public class FirstClass 
{ 
    public OtherClass[,] Others { get; set; } 

    ... 

} 

public class OtherClass 
{ 
    public int Id { get; set; } 
} 

Этот массив Others заполняется во время выполнения. Теперь я хотел бы написать тест, который будет проверять некоторые операции, когда заполняется Others. Поэтому мне нужно передать образцы массивов методам тестирования. Я не хочу создавать массивы OtherClass, потому что у многих из этих образцов массивов и мне придется написать:

 OtherClass[][,] samples = new[] 
     { 
      new OtherClass[,] 
      { 
       { new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };}, 
       { new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };,new OtherClass() { Id = 2 };}, 

etc.. 

некрасиво!

Так что в моем Tests проекте я создал массив только целых чисел (Id ы):

int[][,] samples = new[] 
    { 
     new int[,] 
     { 
      {1,0,0,0,0,0,0}, 
      {0,2,0,0,0,0,0}, 
      {0,0,3,0,0,0,0}, 
      {0,0,0,4,0,0,0} 
     }, 
     new int[,] 
     { 
      {0,0,0,0,0,0,0}, 
      {0,0,0,0,0,0,0}, 
      {1,2,3,4,5,6,7}, 
      {0,0,0,0,0,0,0} 
     } 
    }; 

гораздо более удобным для чтения ... но теперь мне нужно создать конструктор для FirstClass, который принимает в качестве параметра int[,] и создайте OtherClass [,] с идентификаторами из параметра.

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

[TestFixture] 
class BoardTests 
{ 
    [Test] 
    [TestCaseSource("samples")] 
    public void FirstTest(int[,] board) 
    { 
     FirstClass aClass = new FirstClass(board); 
     //Test an operation on aClass 
    } 
} 

Итак, мой вопрос: Это хорошая практика, чтобы создать дополнительный конструктор ТОЛЬКО для испытаний? Я не буду использовать этот конструктор в производственном коде. Или у вас есть лучшее решение?

+0

Вопрос только в том случае, если «Другие» выставлены как открытое свойство, так почему бы не просто инициализировать его любыми значениями, которые вы хотите в своем тесте? – Thangadurai

+0

Вы можете создать отдельный класс, который делает сопоставление между int [,] и другим [] (тот же код, который вы собираетесь писать в новом конструкторе). Таким образом вы отделяете логику. – ssimeonov

ответ

2

Теперь мне нужно создать конструктор для FirstClass, который принимает int[,] в качестве параметра и создать OtherClass[,] с Id с от параметра.

Хотя это, конечно, вариант, вы, конечно, не должны это сделать, если вы предпочитаете. Решение, которое хранит ваши конструкторы без изменений, чтобы сделать частный метод в тестовом классе для преобразования int[,] в OtherClass[,]:

private static ToOtherClass(int[,] ids) { 
    var OtherClass[,] res = ... 
    // Do the conversion here 
    return res; 
} 

Теперь вы можете использовать этот метод для получения легко читаемого кода, который не использует специальный конструктор:

OtherClass[][,] samples = new[] 
{ 
    ToOtherClass(new int[,] 
    { 
     {1,0,0,0,0,0,0}, 
     {0,2,0,0,0,0,0}, 
     {0,0,3,0,0,0,0}, 
     {0,0,0,4,0,0,0} 
    }), 
    ToOtherClass(new int[,] 
    { 
     {0,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,0}, 
     {1,2,3,4,5,6,7}, 
     {0,0,0,0,0,0,0} 
    }) 
}; 
+0

Я об этом покрою. Я просто не был уверен, что реализация дополнительной логики просто для теста - это хорошая практика. –

+0

@AnnaLong. Нет сомнений в том, что для реализации этой логики для тестирования остается только вопрос, где эта логика будет. Конструкторы не являются хорошим местом для тестовой логики, потому что они остаются в готовом коде. С другой стороны, испытательные приборы являются идеальным местом для такой логики, потому что они не предоставляются пользователям вашей библиотеки. – dasblinkenlight

+0

Вы правы, это имеет смысл. Последний вопрос: почему ваш метод «ToOtherClass» является статическим?Я никогда не думал об этом, но класс 'TestFixture' вообще не должен быть создан. –

Смежные вопросы