2016-06-02 2 views
2

Я все еще пытаюсь следовать по пути к TDD.Как использовать TDD, когда ваш метод предназначен для выполнения многих задач

Предположим, у меня есть SunSystemBroker, вызванный, когда файл загружен в общую папку. Этот брокер разработан, чтобы открыть этот файл, извлечь из него записи, попытаться найти связанные платежи в других системах и, наконец, вызвать рабочий процесс!

Если я хочу следовать TDD, чтобы разработать метод IBroker.Process(), как это сделать?

Примечание: Брокер - это независимые сборки, наследуемые от IBroker и загруженные консольным приложением (например, плагины).

Эта консоль отвечает за запуск каждого брокера!

public interface IFileTriggeredBroker : IBroker 
{ 
    FileSystemTrigger Trigger { get; } 
    void Process(string file); 
} 

public class SunSystemPaymentBroker : IFileTriggeredBroker 
{ 
    private readonly IDbDatasourceFactory _hrdbFactory; 
    private readonly IExcelDatasourceFactory _xlFactory; 
    private readonly IK2DatasourceFactory _k2Factory; 
    private ILog _log; 

    public void Process(string file) 
    { 
     (...) 
     // _xlFactory.Create(file) > Extract 
     // _hrdbFactory.Create() > Find 
     // Compare Records 
     // _k2Factory.Create > Start 
    } 
} 

Каждый метод испытаны индивидуально.

Спасибо Себа

+0

Я не уверен, что это на самом деле ваш вопрос или нет ...но у меня всегда был аналогичный вопрос, когда речь идет о методах, которые «все вместе». Если у вас есть методы 'Foo',' Bar' и 'Baz', все из которых полностью автономны и делают что-то в одиночку, но вам нужно связать их вместе для желаемого поведения, я думаю, что« цепочка »представляет собой единый но я никогда не был уверен, что назвать эти типы классов. И насколько они проверяются, просто ли это означает, что этот «цепочка» вызывает все необходимые методы из 'Foo',' Bar' и 'Baz'? – Kritner

ответ

1

Учитывая, что вы говорите, что каждый метод:

_xlFactory.Create(file); 
_hrdbFactory.Create(); 

// Compare Records 
_k2Factory.Create(); 

тестируется индивидуально, есть очень мало логики, чтобы проверить в Process(file).

Если вы используете что-то вроде Moq, вы можете проверить, что вызовы происходят:

// Arrange 
const string File = "file.xlsx"; 
var xlFactory = new Mock<IExcelDatasourceFactory>(); 
var hrbdFactory = new Mock<IDbDatasourceFactory>(); 
var k2Factory = new Mock<IK2DatasourceFactory>(); 

// Act 
var sut = new SunSystemPaymentBroker(xlFactory.Object, hrdbFactory.Object, k2Factory.Object); // I'm assuming you're using constructor injection 
sut.ProcessFile(File); 

// Assert 
xlFactory.Verify(m => m.Create(File), Times.Once); 
hrbdFactory.Verify(m => m.Create(), Times.Once); 
k2Factory.Verify(m => m.Create(), Times.Once); 

Для краткости, я сделал это как один тест, но взлом 3 тестов с одним «утверждают» (звонки verify) более реалистично. Для TDD вы должны написать каждый тест, прежде чем подключать этот метод в пределах Process(file).

Вы также можете посмотреть, имеющую большие, тесты уровня интеграции, где вы проходите в конкретных версиях IExcelDatasourceFactory, IK2DatasourceFactory, IDbDatasourceFactory и осуществляете систему более подробно.

В книге Growing Object-Oriented Software Guided by Tests, это будет определено как Acceptance Test который будет написан еще до начала работы, и не в то время как функция добавляется в небольших TDD петлями функциональности, которые работают в направлении общей функции.

1

у вас есть два различных вопроса:

1) метод предназначен для выполнения многих задач Сделайте свой код SOLID, и применять единый принцип ответственности. Сплит с едиными принципами ответственности: т.е. отвечает только за одну задачу.

2) вы хотите протестировать процедуру, которая работает по побочному эффекту (изменить среду), а не чистую функцию. Итак, я бы посоветовал вам разделить свой код на чистые вызовы функций (т. Е. Никаких побочных эффектов).

Читайте также https://msdn.microsoft.com/en-us/library/aa730844%28v=vs.80%29.aspx

+0

Все мои брокеры разные, потому что их целью является достижение различных задач. Консольное приложение знает только о методе процесса (из интерфейса). У меня нет способа узнать, что мне нужно вызвать метод Extract, а затем сделать, а затем напечатать (...). Об этом знает только брокер. – Seb