Можем ли мы программно войти в CloudKit для модульного тестирования? Это нецелесообразно, потому что даже если бы мы могли, тесты были бы медленными & amp; хрупкий. Вместо этого рассматривайте CloudKit как архитектурную границу. Модульные тесты могут идти прямо до этой границы. И мы можем притворяться, что вещи возвращаются с границы. Таким образом, мы можем проверить все пути.
Чтобы запрограммировать эту границу в свой код, используйте протокол. Этот протокол будет слайсом, содержащим только те методы CKContainer, которые вы хотите. (Это принцип разделения интерфейса в действии.) Поскольку CKContainer уже реализует этот метод, мы можем присоединить его как пустое расширение.
protocol CKContainerProtocol {
func accountStatus(completionHandler: @escaping (CKAccountStatus, Error?) -> Void)
}
extension CKContainer: CKContainerProtocol {}
Затем добавьте свойство в модель представления:
var cloudKitContainer: CKContainerProtocol = CKContainer.default()
Значение по умолчанию означает, что ваш код будет продолжать использовать настоящий CKContainer, если не указано иное. Измените свой код так, чтобы он звонил cloudKitContainer
вместо CKContainer.default()
.
Затем в тестовом коде вы можете предоставить другую реализацию CKContainerProtocol. Это позволит вам делать заглушки и насмешки. Вы можете подтвердить, что accountStatus()
вызывается ровно один раз. И вы можете использовать его замыкание с разными значениями CKAccountStatus, чтобы подтвердить, как вызывается ваше завершение Completion.
(Подобные вещи будут подробно рассмотрены в книге о модульном тестировании iOS, которую я сейчас пишу .)
Полагайте, что этот столбец является ценой, отображенной клиенту, который может содержать что-либо.
Вы пригласили бы горе, при попытке сделать его числовым столбцом. Вы уже боретесь с двумя несоответствующими значениями, и завтра Ваш босс мог бы хотеть больше...
Вы получаете идею.
Если Вам действительно нужен числовой столбец, затем называют это internalPrice или чем-то, и помещают Ваши числовые ограничения на тот столбец вместо этого.
Спросите себя...
Я буду добавлять эти значения? Я буду сортировать по цене? Я должен буду преобразовать в другие значения валюты?
ИЛИ
Я буду просто отображать это значение на веб-странице?
Если это - просто подробный перечень и не используемое для вычисления, простое решение к цене в магазине как строка (varchar).
Возможно, используйте индикатор 'типа' в основной таблице с одной дочерней таблицей, позволяющей числовую цену и другого с символьными значениями. Они могли быть объединены в одну таблицу, но я обычно избегаю этого. Вы могли также использовать таблицу промежуточного канала с количеством, если Вы когда-нибудь хотите к базисной цене на купленном количестве.
Большой выбор:
Я, вероятно, пошел бы для 2 как прагматическое решение и расширение 5, если бы мне было нужно что-то очень общее для универсальной ценовой системы.
Если это - степень Вашей модели данных, то varchar поле прекрасно. Ваши нормальные цены - десятичное число, как они могут быть - вероятно, бесполезно для вычислений так или иначе. Как Вы сравниваете $10/ГБ для "передачи данных" и $25/месяцев для "хостинга домена"?
Ваша модель данных для этого конкретного проекта не об оценке, а об отображении оценки. Дизайн с этим в памяти.
Конечно - если Вы храните цену конкретный клиент, оплаченный конкретный проект, или пытаетесь выяснить, что заряжать конкретного клиента - затем, у Вас есть другой (более сложный) домен. И Вам будет нужна другая модель для поддержки этого.
В этом по крайней мере одна из альтернативных цен число включили, что относительно столбца Price, ценового типа? Нормальные записи могли быть числом для долларовой стоимости и ввести 'доллар', и другой мог быть 8 и 'PercentOverCost' и пустой указатель и 'ISA' (для столбца Price и PriceType).
У Вас должна, вероятно, быть таблица PriceType для проверки и PriceTypeID, если Вы идете этим путем.
Это позволило бы другим типам оценки быть добавленными в будущем (указание единичных цен, внешняя валюта), дало бы Вам число и также помогло бы знать, с каким типом, оценивая Вы имеете дело..
Когда мне приходилось делать такие вещи в прошлом, я использовал:
Price Unit Display
10.00 item null
100.00 box null
null null "Call for Pricing"
Цена будет десятичным типом данных (любое точное числовое значение, не вещественное или вещественное), единица измерения и отображение будут некоторым типом строковых данных.
Затем используется оператор case для отображения цены либо с ценой за единицу, либо с отображением. Также поместите ограничение или триггер в столбец отображения, чтобы он был пустым, если только цена не равна нулю. Ограничение или триггер также должны требовать значение в единицах измерения, если цена не равна нулю.
Таким образом, вы можете рассчитать цены для заказа, где это возможно, и не указывать их, если цена не указана, но отображать и то, и другое. Я'