@astral/mobx-query 1.19.0 → 1.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -67
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
- [Кастомная установка ключей кэширования](#кастомная-установка-ключей-кэширования)
|
|
47
47
|
- [Фоновая загрузка данных QuerySet и InfiniteQuerySet](#фоновая-загрузка-данных-queryset-и-infinitequeryset)
|
|
48
48
|
- [Изменение кэша QuerySet и InfiniteQuerySet](#изменение-кэша-queryset-и-infinitequeryset)
|
|
49
|
-
- [Тестирование
|
|
49
|
+
- [Тестирование](#тестирование)
|
|
50
50
|
- [Core](#core)
|
|
51
51
|
|
|
52
52
|
## Installation
|
|
@@ -935,7 +935,9 @@ docsFetcher.queries.document.createWithConfig({
|
|
|
935
935
|
}
|
|
936
936
|
```
|
|
937
937
|
|
|
938
|
-
## Тестирование
|
|
938
|
+
## Тестирование
|
|
939
|
+
|
|
940
|
+
### Реализация `mockFetcher` (один раз в проекте)
|
|
939
941
|
|
|
940
942
|
Для мокинга QuerySet и InfiniteQuerySet необходимо использовать mock следующего вида:
|
|
941
943
|
```ts
|
|
@@ -948,92 +950,73 @@ type Fetcher = {
|
|
|
948
950
|
const mockFetcher = <TFetcher extends Fetcher>(config: DeepPartial<TFetcher>) => config as TFetcher;
|
|
949
951
|
```
|
|
950
952
|
|
|
951
|
-
**Не используйте
|
|
952
|
-
Причина: `vitest-mock-extended`
|
|
953
|
+
**Не используйте `vitest-mock-extended` для мокинга Fetcher.**
|
|
954
|
+
Причина: `vitest-mock-extended` нарушает работу Mobx.
|
|
953
955
|
|
|
954
|
-
###
|
|
956
|
+
### 1 тест - 1 mobx-query instance
|
|
955
957
|
|
|
956
|
-
```MobxQuery``` инициализируется с параметром: ```enabledAutoFetch```:
|
|
957
958
|
```ts
|
|
958
|
-
const
|
|
959
|
-
|
|
960
|
-
|
|
959
|
+
const setup = () => {
|
|
960
|
+
const mobxQuery = createMobxQuery();
|
|
961
|
+
|
|
962
|
+
const booksFetcherMock = mockFetcher<BooksFetcher>({
|
|
963
|
+
queries: {
|
|
964
|
+
list: mobxQuery.createQuerySet(...),
|
|
965
|
+
},
|
|
966
|
+
});
|
|
967
|
+
}
|
|
961
968
|
```
|
|
962
969
|
|
|
963
|
-
|
|
970
|
+
### Mock Query, Mutation
|
|
971
|
+
|
|
972
|
+
Для определения queries, mutations использовать соответствующие методы mobxQuery:
|
|
964
973
|
```ts
|
|
965
|
-
|
|
974
|
+
const booksFetcherMock = mockFetcher<BooksFetcher>({
|
|
966
975
|
queries: {
|
|
967
|
-
bookList: mobxQuery.createQuerySet((
|
|
968
|
-
execute: () =>
|
|
976
|
+
bookList: mobxQuery.createQuerySet((filters) => ({
|
|
977
|
+
execute: async () => fakeBookList,
|
|
969
978
|
})),
|
|
970
979
|
},
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
export type BooksFetcher = typeof booksFetcher;
|
|
974
|
-
```
|
|
975
|
-
|
|
976
|
-
```BooksListStore``` - использует `BooksFetcher` для получения данных:
|
|
977
|
-
```ts
|
|
978
|
-
class BooksListStore {
|
|
979
|
-
public sort?: SortData;
|
|
980
|
-
|
|
981
|
-
constructor(private readonly _booksFetcher: BooksFetcher) {
|
|
982
|
-
makeAutoObservable(this);
|
|
983
|
-
}
|
|
984
|
-
|
|
985
|
-
private get listQuery() {
|
|
986
|
-
return this._booksFetcher.queries.bookList.create(this.sort);
|
|
980
|
+
mutations: {
|
|
981
|
+
createBook: mobxQuery.createMutation(async (book) => undefined),
|
|
987
982
|
}
|
|
983
|
+
});
|
|
984
|
+
```
|
|
988
985
|
|
|
989
|
-
|
|
990
|
-
const data = this.listQuery.data || [];
|
|
986
|
+
### Mock InfiniteQuery
|
|
991
987
|
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
988
|
+
Для определения `InfiniteQueries` использовать `createInfiniteQuerySet`:
|
|
989
|
+
```ts
|
|
990
|
+
const booksFetcherMock = mockFetcher<BooksFetcher>({
|
|
991
|
+
infiniteQueries: {
|
|
992
|
+
bookList: mobxQuery.createInfiniteQuerySet(
|
|
993
|
+
(filters) => ({
|
|
994
|
+
execute: ({ offset, count }) => fakeBookList,
|
|
995
|
+
}),
|
|
996
|
+
),
|
|
997
997
|
}
|
|
998
|
-
}
|
|
998
|
+
});
|
|
999
999
|
```
|
|
1000
1000
|
|
|
1001
|
-
|
|
1001
|
+
### Ожидание|триггер запроса данных при `enabledAutoFetch` (дефолтное поведение)
|
|
1002
1002
|
|
|
1003
1003
|
```ts
|
|
1004
1004
|
import { when } from 'mobx';
|
|
1005
|
-
import { mockCacheGroups } from '@astral/mobx-query-vitest-mock';
|
|
1006
|
-
|
|
1007
|
-
describe('BooksListStore', () => {
|
|
1008
|
-
it('Список книг форматируется для отображения', async () => {
|
|
1009
|
-
// Для каждого теста необходимо инициализировать свой instance MobxQuery,
|
|
1010
|
-
// в противном случае каждый тест будет модифицировать кэш
|
|
1011
|
-
const mobxQuery = createMobxQuery();
|
|
1012
|
-
|
|
1013
|
-
const fakeBookList = makeFakeBookList(2, { price: 1000 });
|
|
1014
|
-
const fakeBookListItem = fakeBookList.data[0];
|
|
1015
|
-
|
|
1016
|
-
const booksFetcherMock = mockFetcher<BooksFetcher>({
|
|
1017
|
-
queries: {
|
|
1018
|
-
bookList: () => mobxQuery.createQuerySet(() => ({
|
|
1019
|
-
execute: async () => fakeBookList,
|
|
1020
|
-
})),
|
|
1021
|
-
},
|
|
1022
|
-
});
|
|
1023
1005
|
|
|
1024
|
-
|
|
1006
|
+
const booksFetcherMock = mockFetcher<BooksFetcher>({
|
|
1007
|
+
queries: {
|
|
1008
|
+
bookList: mobxQuery.createQuerySet((filters) => ({
|
|
1009
|
+
execute: async () => fakeBookList,
|
|
1010
|
+
})),
|
|
1011
|
+
},
|
|
1012
|
+
});
|
|
1025
1013
|
|
|
1026
|
-
|
|
1027
|
-
// Загрузка данных начнется автоматически при обращении к sut.list за счет параметра enabledAutoFetch
|
|
1028
|
-
await when(() => Boolean(sut.list?.length));
|
|
1014
|
+
const sut = new Store(booksFetcherMock);
|
|
1029
1015
|
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
});
|
|
1035
|
-
});
|
|
1036
|
-
});
|
|
1016
|
+
// Обращаемся к data из query -> триггер запроса данных -> ожидаем когда загрузятся данные
|
|
1017
|
+
await when(() => Boolean(sut.data));
|
|
1018
|
+
|
|
1019
|
+
expect(sut.status.isSuccess).toBe(true);
|
|
1037
1020
|
```
|
|
1038
1021
|
|
|
1039
1022
|
## Core
|