Ответ 1
Ух ты... это большой вопрос!
Немного по этому вопросу в документации. Не достаточно, чтобы быть уверенным.
Я предполагаю, что вы довольно новичок в тестировании JavaScript. Если вы видели DocCode, вы знаете, что здесь мы используем QUnit. Многие предпочитают Жасмин, Мокку или что-то еще; Я могу говорить только с QUitit.
Первый шаг - узнать QUnit. Это не сложно. QUnit собственное введение. Мне нравится слайд-панель Ben Alhman.
Затем я практиковал с небольшими тестами вашей бизнес-логики, которые НЕ проходят по проводу. Может быть любая интересная логика в ViewModel или, возможно, некоторое вычисляемое свойство в объекте model (entity).
Вы можете легко протестировать взаимодействие VM с "DataContext", не обойдя провод. Создайте "FakeDataContext" и добавьте это в свои тесты вместо реального. В качестве альтернативы вы можете "патч обезьяны - настоящий "DataContext" в стратегических местах, которые превращают его в подделку.
При подделке DataContext я считаю полезным использовать способность Breeze ограничить запросы локальным кешем. Локальный кеш служит в качестве суррогата в памяти для данных, которые в противном случае были бы получены с сервера.
Это может быть так же просто, как установка FetchStrategy
менеджера по умолчанию QueryOptions
... возможно, как это
var queryOptions = new QueryOptions({ mergeStrategy: MergeStrategy.PreserveChanges, fetchStrategy: FetchStrategy.FromCache }); var entityManager = new EntityManager({ serviceName: "yourEndpoint", queryOptions: queryOptions });
Теперь ваши запросы будут направлены в кеш (если у них нет явного QueryStrategy
).
Теперь сделайте это полезным, заполнив кэш тестовыми данными. В DocCode имеется множество примеров фальшивых сущностей. Вот пример подделанного клиента:
var testCustomer = manager.createEntity('Customer', { // test values CustomerID: testCustomerID, CompanyName: testCustomerName, ... }, breeze.EntityState.Unchanged); // as if fetched from the database
Если мне нужны одни и те же данные теста, я пишу "Мать данных", которая заполняет EntityManager тестовыми данными для меня.
Я могу сделать много испытаний таким образом, не ударяя по серверу. Все время я работаю с объектами Breeze в JavaScript... так же, как и в производственном коде. Мне не нужно изучать насмешливую библиотеку или вводить другой инструмент.
Другой подход - более жесткий, более низкий, но более мощный - это заменить Breeze адаптер AJAX по умолчанию с подделкой, которая возвращает тестовые значения JSON, как если бы они пришли с сервера. Вы можете использовать такой инструмент, как Fiddler, чтобы сделать поддельный JSON из мгновенных снимков полезной нагрузки. Вы также можете использовать этот трюк для моделирования поведения сохранения на стороне сервера.
Обновление 3 мая 2013 г.
Пример DocCode включает новый TestAjaxAdapter
для моделирования ответов сервера, как я только что описал. Проверьте testAjaxAdapter.js и посмотрите, как его использовать в testAjaxAdapterTests.js. Эта конкретная версия DocCode доступна только на GitHub, но она будет официально опубликована в выпуске сразу после v.1.3.2.
... конец обновления; вернуться к исходному сообщению...
Поддельные потоки JSON внутри вашего поддельного адаптера AJAX кажутся слишком большим из PITA?
Выполните безумные навыки Бриза и напишите пользовательский JsonResultsAdapter, чтобы создать эти подделки. Попросите ваш поддельный адаптер AJAX вернуть пустой массив для каждого запроса запроса. Затем вы можете делать все, что хотите, в методах extractData
и visitNode
вашего JsonResultsAdapter
.
Я уверен, что очевидно, что вы можете подделать свой серверный контроллер. Конечно, ваши тесты по-прежнему будут совершать поездки "по проводам", чтобы добраться до этого контроллера.
Надеюсь, что эти подсказки достаточны, чтобы заставить вас возглавить в удовлетворительном направлении.
Обновление 30 апреля 2013 г.
Бриз понадобится метаданные, чтобы выполнить свою задачу. Ваши метаданные поступают с сервера. Вызов сервера для метаданных, казалось бы, превзошел цель полностью отключенных тестов.
Так верно. Теперь я не сторонник в этом вопросе. Я не против попадания сервера на метаданные в верхней части тестового модуля... ровно один раз... и затем запускаю остальные мои тесты, не переходя на сервер для метаданных. Но если вы пурист или просто не хотите этого делать, вы можете записать метаданные на стороне сервера в файл JavaScript на сервере и загрузить статический текст script на странице HTML-теста тестового запуска, как и любой другой script.
В качестве примера этого метода рассмотрим App_Data/WriteMetadataScriptFiles.cs
, который генерирует файл JavaScript для модели Northwind в предстоящей (позже на этой неделе) версии v.2.3.2 DocCode. Тесты DocCode динамически загружают файлы JavaScript с помощью require.js. В тестовом файле metadataTests.js показано, как загрузить сгенерированный файл northwindMetadata.js с требованием. Вам не обязательно быть умным, если вы не используете require.js.
Примечание для себя: напишите несколько примеров, иллюстрирующих эти методы.