2015-11-14 3 views
2

Название самоочевидно, но я уточню. Я использую FakeItEasy framework, где у меня есть возможность проверить количество раз, когда метод был вызван.Должен ли я беспокоиться о количестве обращений к издеваемому объекту

A.CallTo(() => foo.Bar()).MustHaveHappened();  

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

ответ

1

Вы должны заботиться о том, сколько раз вызывалась зависимость во многих случаях.

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

public interface IDataInserter 
{ 
    void Insert(Data[] data); 
} 

И предположим, что в некоторых случаях вам необходимо вставить около 10000 предметов. Но веб-служба не может обрабатывать такой объем данных за один раз. Поэтому вы решили создать декоратор, который будет разбивать данные на несколько кусков и отправлять каждый кусок в один запрос.

public class SplittingDecorator : IDataInserter 
{ 
    private readonly IDataInserter m_DataInserter; 

    public SplittingDecorator(IDataInserter data_inserter) 
    { 
     m_DataInserter = data_inserter; 
    } 

    public void Insert(Data[] data) 
    { 
     var chunks = 
      data 
      .Select((d, i) => new {d, i}) 
      .GroupBy(x => x.i/50) 
      .Select(x => x.Select(y => y.d).ToArray()) 
      .ToList(); 

     foreach (var chunk in chunks) 
     { 
      m_DataInserter.Insert(chunk); 
     } 
    } 
} 

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

В таком тесте, вы должны утверждать, что издевались IDataInserter был вызван несколько раз X при вызове SplittingDecorator.Insert с данным размером Y.

Например, если размер данных (длина data массива) это 160 элементов, вы хотите проверить, что макет был вызван 4 раза.

+0

Да, но какое это указание на самом деле дает вам? Если я смотрю с точки зрения пользователя, вы не знаете, что сделал метод вставки. Вы не знаете, соответствует ли результат. Вы просто знаете, что метод был вызван, но вы этого не сделаете, если он сделал правильную вещь. – Tsahi

+0

Если вы думаете об ответственности этого декоратора, его нужно разбить запрос на несколько кусков. И это именно то, что вы должны проверить. Вы должны проверить, что такой класс разделил бы эти данные на несколько кусков. Вы проверяете, что он вызвал веб-службу X раз. Вам также необходимо проверить, что данные не были потеряны, т. Е. Все 160 элементов данных были частью некоторого запроса службы. –

+0

Обратите внимание, что если этот класс не разбил данные правильно, это означает, что он не выполняет свою работу. Поэтому вы должны проверить это. –

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