2013-06-11 4 views
0

Я начал опрокидывать модульные тесты и создал пару тестов, которые проверяют один из моих методов презентатора. Это тестирование требует макета моего класса доступа к данным и, в частности, одного метода. Это оригинальный метод из моего класса доступа к данным:Методы, адаптированные для выполнения модульных испытаний. Это просто кажется неправильным

public IEnumerable<IArea> GetAreaList() 
    { 
     ConnectToTFSProject(); 

     XmlNode areaNode = GetAreaNode(); 
     List<IArea> areaList = new List<IArea>(); 

     foreach (XmlNode node in areaNode.FirstChild.ChildNodes) 
     { 
      IArea area = new Area() { AreaName = node.Attributes["Name"].Value }; 
      areaList.Add(area); 
     } 

     areaList.Sort(); 

     return areaList; 
    } 

Я хотел бы проверить метод презентаторов с различными сценариями, например:

  • обычный список областей
  • пустой список области
  • список областей с дубликатами
  • список или областей, содержащих одну пустую область строки

Моя первая мысль заключалась в создании отдельного класса доступа к данным для каждого из этих сценариев. Я подумал, что это немного громоздко, поэтому я немного адаптировал метод, чтобы можно было прочитать разные XML-файлы, содержащие данные, относящиеся к текущему тесту. Вот как мой макет метод выглядит:

public IEnumerable<IArea> GetAreaList(string dataSource) 
    { 
     List<IArea> areaList = new List<IArea>(); 

     XmlTextReader areaReader = new XmlTextReader(dataSource); 

     while (areaReader.Read()) 
     { 
      if (areaReader.NodeType == XmlNodeType.Text) 
       areaList.Add(new Area() { AreaName = areaReader.Value }); 
     } 

     return areaList; 
    } 

Этот фиктивный метод будет вызываться из класса PresenterTest следующим образом:

[TestMethod] 
    public void PopulateAreaComboBox_WithValidAreaList() 
    { 
     //Act 
     _presenter.PopulateAreaComboBox(mockFolderPath + "MockAreaList.xml"); 

     //Assert 
     Assert.AreEqual(3, _view.AreaListLoaded.Count); 
    } 

    [TestMethod] 
    public void PopulateAreaComboBox_WithEmptyAreaList() 
    { 
     //Act 
     _presenter.PopulateAreaComboBox(mockFolderPath + "MockEmptyAreaList.xml"); 

     //Assert 
     Assert.AreEqual(0, _view.AreaListLoaded.Count); 
    } 

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

public IEnumerable<IArea> GetAreaList(string dataSource) 

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

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

+0

Да, высмеивать класс с помощью метода GetAreaList должен быть способ получить. Но ваш тест сам по себе выглядит неправильным или, по крайней мере, сложным, как unittest. Вы должны проверить, работает ли GetAreaList, и, может быть, если ваш ведущий может заполнить представление данными, но ваш тестовый код предполагает, что он проверяет оба сразу? – Ralf

ответ

0

Я решил это, разоблачив публичную строку (TestDataXml) в моем классе доступа к данным. Затем я создал новый экземпляр фиктивного класса доступа к данным для каждого теста, установив эту строку в местоположение отдельного тестового XML-данных файла каждый раз:

class MockDataRetrieval : IDataRetrieval 
{ 
    public string TestDataXml { get; set; } 

    public IEnumerable<IArea> GetAreaList() 
    { 
     List<IArea> areaList = new List<IArea>(); 

     XmlTextReader areaReader = new XmlTextReader(TestDataXml); 

     while (areaReader.Read()) 
     { 
      if (areaReader.NodeType == XmlNodeType.Text) 
       areaList.Add(new Area() { AreaName = areaReader.Value }); 
     } 

     return areaList; 
    } 
} 

Для вызова фиктивного метода из класса PresenterTest:

[TestMethod] 
    public void PopulateAreaComboBox_WithValidAreaList() 
    { 
     //Arrange 
     _data = new MockDataRetrieval() { TestDataXml = mockFolderPath + "MockAreaList.xml" }; 
     _view = new MockMainForm(); 

     _presenter = new TestCasePresenter(_view, _data); 

     //Act 
     _presenter.PopulateAreaComboBox(); 

     //Assert 
     Assert.AreEqual(3, _view.AreaListLoaded.Count); 
    } 

    [TestMethod] 
    public void PopulateAreaComboBox_WithEmptyAreaList() 
    { 
     //Arrange 
     _data = new MockDataRetrieval() { TestDataXml = mockFolderPath + "MockEmptyAreaList.xml" }; 
     _view = new MockMainForm(); 

     _presenter = new TestCasePresenter(_view, _data); 

     //Act 
     _presenter.PopulateAreaComboBox(); 

     //Assert 
     Assert.AreEqual(0, _view.AreaListLoaded.Count); 
    } 

Ralf: Спасибо за ваш комментарий. Этот вопрос связан с тестированием метода Presenter.PopulateAreaComboBox. Метод GetAreaList в этом примере относится к классу доступа к макету данных и просто предоставляет тестируемый метод тестовыми данными.

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