Тестовая функция в проекте MVC - PullRequest
0 голосов
/ 27 июля 2010

Итак, я хочу протестировать одну из своих функций в своем веб-проекте, но она на самом деле ни с чем не связана в проекте (над этой частью работает кто-то еще). Функция принимает поле «ID», уходит, выполняет некоторые запросы, получает некоторые данные, выполняет некоторые вычисления, а затем записывает несколько строк в FileStream и возвращает этот поток. Я просто хочу проверить его, записав файл на свой компьютер локально и работая с этим каталогом файлов после завершения функции.

Так что мой вопрос в основном:

1) Как я вызываю эту функцию только для целей тестирования, чтобы я мог проверить все запросы / вычисления / записи в файл и т. Д., Пока она еще не подключена к другой части приложения.

2) Как я могу изменить 'Return fs', чтобы FileStream записывал на свой компьютер локально для просмотра записанного файла.

Спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 27 июля 2010

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

public class Something 
{
  IDataProvider provider;
  IFileSystem fileSystem;
  public Something(IDataProvider provider,  IFileSystem fileSystem) 
  {
     this.provider = provider;
     this.fileSystem = fileSystem;
  }

   void DoThing(int id) 
   {
        // make database call to get data
        var data = provider.GetData(id);

        fileSystem.Write("someFilePath",data);
   }

}

При этом вы можете написать тест как таковой (в этом случае используется синтаксис Moq ):

void SomeTest() 
{
  var mockDataProvider = new Mock<IDataProvider>();
  var mockFileSystem = new Mock<IFileSystem>();
  var something = new Something(mockDataProvider.Object, mockFileSystem.Object);
  var data = "someData";
  mockDataProvider.Setup(x => x.GetData(5)).Return(data);

  DoThing(5);

  mockFileSystem.Verify(x => x.Write("someFilePath",data);


}
0 голосов
/ 27 июля 2010

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

Вот обзор ...

Настройте свой класс так, чтобы он принимал доступ к данным и средство записи файлов в конструкторе. Затем вы можете передать имитированную или тупую версию доступа к данным и средства записи файлов, чтобы вам физически не нужно было подключаться к базе данных или писать в файловую систему для проверки вашего кода.

В «реальном мире» вы передаете подлинный доступ к данным и средство записи файлов.

В «мире тестирования» вы используете что-то типа MOQ или Rhino Mocks для создания притворной версии доступа к данным, это означает, что вы можете предсказать, что будет возвращаться из доступа к данным каждый раз, когда вы тестируете, поскольку это не реальная база данных, это некоторые данные, которые вы подготовили. Вы также можете создать притворное средство записи файлов, которому на самом деле не нужно записывать настоящий файл.

Затем вы можете проверить свой класс в изоляции.

Внедрение зависимостей:

http://msdn.microsoft.com/en-us/magazine/cc163739.aspx

Moq

http://code.google.com/p/moq/

...