TDD и Дразнящий TcpClient

UIStackView не позволяет изменять цвет фона:

UIStackView - это не рендеринг подкласса UIView; то есть он не предоставляет никакого собственного пользовательского интерфейса. Вместо этого он просто управляет положением и размером своих упорядоченных видов. В результате некоторые свойства (например, backgroundColor) не влияют на представление стека. Точно так же вы не можете переопределить layerClass, draw ( :) или draw (: in:).

blockquote>

(из UIStackView )

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

10
задан James Thigpen 29 September 2008 в 19:49
поделиться

3 ответа

При прибытии для насмешки классов, которые не являются дружественным тестом (т.е. изолированная/не реализация любого интерфейса/методов не являются виртуальными) Вы, вероятно, хотели бы использовать шаблон разработки Адаптера.

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

public interface ITcpClient
{
   Stream GetStream(); 
   // Anything you need here       
}
public class TcpClientAdapter: ITcpClient
{
   private TcpClient wrappedClient;
   public TcpClientAdapter(TcpClient client)
   {
    wrappedClient = client;
   }

   public Stream GetStream()
   {
     return wrappedClient.GetStream();
   }
}
26
ответ дан 3 December 2019 в 14:35
поделиться

Я думаю, что @Hitchhiker на правильном пути, но мне также нравится думать об абстракции подобных вещей просто шаг вперед.

Я не дразнил бы TcpClient непосредственно, потому что это все еще свяжет Вас слишком тесно с конкретной реализацией даже при том, что Вы записали тесты. Таким образом, Ваша реализация связывается с методом TcpClient конкретно. Лично, я попробовал бы что-то вроде этого:

   [Test]
    public void TestInput(){

       NetworkInputSource mockInput = mocks.CreateMock<NetworkInputSource>();
       Consumer c = new Consumer(mockInput);

       c.ReadAll();
    //   c.Read();
    //   c.ReadLine();

    }

    public class TcpClientAdapter : NetworkInputSource
    {
       private TcpClient _client;
       public string ReadAll()
       { 
           return new StreamReader(_tcpClient.GetStream()).ReadToEnd();
       }

       public string Read() { ... }
       public string ReadLine() { ... }
    }

    public interface NetworkInputSource
    {
       public string ReadAll(); 
       public string Read();
       public string ReadLine();
    }

Эта реализация разъединится, Вы от Tcp связали детали в целом (если это - цель дизайна), и можно даже передать по каналу в тестовом входе от твердого кодированного множества значений или тестовом входном файле. Очень рука, если Вы на пути к тестированию Вашего кода для долгого пути.

5
ответ дан 3 December 2019 в 14:35
поделиться

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

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

2
ответ дан 3 December 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: