2015-04-09 3 views
0

Я пытаюсь проверить следующий метод:Использование Moq, как мне высмеять метод, который изменяет поток, который он принимает в качестве параметра?

public void SaveDashboardToPersistentDashboard(
    Dashboard dashboard, PersistentDashboard persistentDashboard) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     dashboard.SaveToXml(stream); 
     persistentDashboard.Definition = stream.ToArray(); 

     persistentDashboard.Name = dashboard.Title.Text; 
     _unitOfWork.CommitChanges(); 
    } 
} 

Метод принимает DevExpress панель, вызывает SaveToXml (переходящий в MemoryStream), а затем записывает массив потока в Definition свойства а PersistentDashboard Poco в.

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

Я новичок в Moq и не могу решить, как изменить содержимое потока, переданного в SaveToXml, - по крайней мере, не пропуская поток в метод SaveDashboardToPersistentDashboard. Поток связан с поведением метода, поэтому я не особо заинтересован в передаче его в качестве параметра.

Есть ли способ достичь того, что я пытаюсь сделать?

ответ

2

Это проблема с вашим дизайном. Не с насмешливой библиотекой, которую вы используете.

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

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

Нечто подобное:

public interface IDashboard 
{ 
    void SaveToXml(Stream stream); 
} 

public class DashboardWrapper : IDashboard 
{ 
    private readonly Dashboard dashboard = new Dashboard(); 

    public void SaveToXml(Stream stream) 
    { 
     this.dashboard.SaveToXml(stream); 
    } 
} 

Вы можете использовать абстрактную фабрику или IoC-контейнер для создания этих оберток.

ETA: Не знаете, как создаются объекты Dashboard. Альтернативно, дайте оболочке конструктор, который принимает экземпляр Dashboard и реализует operator для неявного преобразования, которое использует этот конструктор.