UIStackView
не позволяет изменять цвет фона:
UIStackView - это не рендеринг подкласса UIView; то есть он не предоставляет никакого собственного пользовательского интерфейса. Вместо этого он просто управляет положением и размером своих упорядоченных видов. В результате некоторые свойства (например, backgroundColor) не влияют на представление стека. Точно так же вы не можете переопределить layerClass, draw ( :) или draw (: in:).
blockquote>(из UIStackView )
Простой обходной путь - добавить еще один
UIView
за стековым представлением, настроить ограничения в соответствии с положением и размером стека вид (равен сверху, слева, справа, снизу) и измените цвет фона этого вида.
При прибытии для насмешки классов, которые не являются дружественным тестом (т.е. изолированная/не реализация любого интерфейса/методов не являются виртуальными) Вы, вероятно, хотели бы использовать шаблон разработки Адаптера.
В этом шаблоне Вы добавляете переносящийся класс, который реализует интерфейс. Необходимо затем дразнить интерфейс и удостовериться все использование кода, которое взаимодействует через интерфейс вместо недружелюбного реального класса. Это выглядело бы примерно так:
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();
}
}
Я думаю, что @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 связали детали в целом (если это - цель дизайна), и можно даже передать по каналу в тестовом входе от твердого кодированного множества значений или тестовом входном файле. Очень рука, если Вы на пути к тестированию Вашего кода для долгого пути.
Используя Шаблон "адаптер" совершенно определенно стандартный подход TDD к проблеме. Вы могли, однако, также просто создать другой конец соединения TCP и иметь Ваш диск тестовой обвязки это.
IMO широкое использование класса адаптера запутывает самые важные части дизайна и также имеет тенденцию удалять много материала от того, чтобы быть протестированным, которое действительно должно быть протестировано в контексте. Таким образом, альтернатива должна создать Ваши леса тестирования для включения большего количества системы под тестом. При создании тестов с нуля Вы все еще достигнете способности изолировать причину отказа к данному классу или функции, это просто не будет в изоляции...