Как частично смоделировать схему в GraphQL и Apollo? - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь высмеять только небольшую часть типа Contact ниже.Мои средства распознавания возвращают данные из конечной точки REST для всех полей в Contact, кроме test.В демонстрационных целях я хочу иметь возможность сохранять данные сервера для всех других полей, но только издеваться над полем test.

У меня определена следующая схема GraphQL:

const typeDefs = `
    type Contact {
        id: String,
        first_name: String
        last_name: String
        middle_name: String
        date_of_birth: String
        test: String
    }

    type Query {
        contacts: [Contact!]!
        Contact(id: String!): Contact!
    }
`;

У меня определены следующие макеты:

const mocks = {
    Contact: () => ({
        test: () => "This data is mocked!"
    })
};

И определены следующие резольверы:

const resolvers = {
  Query: {
    contacts: async (parent, args, { dataSources }) =>
      dataSources.MYAPI.getAllContacts(),
    Contact: async (parent, { id }, { dataSources }) =>
      dataSources.MYAPI.getContact(id)
  }
};

Затем я инициализирую сервер с помощью:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  mocks,
  dataSources: () => {
    return {
      MYAPI: new MYAPI()
    };
  },
  mockEntireSchema: false
});

Вышене работает.Я добавил конфигурацию mockEntireSchema:true, которая предотвращала переопределение ответа моего сервера, но атрибут test по-прежнему возвращает макет String по умолчанию Hello World вместо моего попытки This data is mocked!.

. Я знаюмакет настроен правильно, потому что я могу удалить конфигурацию mockEntireSchema и мои данные макета отображаются правильно.

Возможно ли это вообще или поведение mockEntireSchema и макеты вообще не поддерживают это?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Согласно документации , вы хотите сохранить mockEntireSchema как false и создать объект mocks, в котором есть компоненты, которые вы все еще хотите высмеивать. Все остальные распознаватели будут использоваться так, как они существуют. Тем не менее, будут использоваться любые макеты, которые вы задали, поэтому преобразователи запросов, возвращающие типы Contact, никогда не будут использоваться, поскольку вы определили Contact как макет.

0 голосов
/ 25 апреля 2019

Теперь я считаю, что это действительно ошибка в Apollo https://github.com/apollographql/graphql-tools/issues/1114. Когда вы используете preserveResolvers: true или mockEntireSchema: false (они одинаковы), он не будет перезаписывать существующие распознаватели, однако я отфильтровал эти преобразователина основе моей фиктивной конфигурации, поэтому они не загружаются в первую очередь.

Это делает частичную насмешку в принципе.Ошибка, однако, заключается в том, что вложенные вызовы () => MockList(100) выдают ошибку в пакете graphql, поскольку graphql интерпретирует MockList object как "не повторяемый".Этого не происходит с preserveResolvers: false

0 голосов
/ 16 ноября 2018

Я не пробовал, но мне кажется, что это должно работать (что вы описываете).Но поскольку этого не происходит, возможный обходной путь - это просто добавить преобразователь поля для поля test:

const resolvers = {
  Contact: {
    test: () => "This data is not mocked but the effect is the same!"
  },
  Query: {
    contacts: async (parent, args, { dataSources }) =>
      dataSources.MYAPI.getAllContacts(),
    Contact: async (parent, { id }, { dataSources }) =>
      dataSources.MYAPI.getContact(id)
  }
};
...