如何在GraphQL和Apollo中部分模拟模式?

如何在GraphQL和Apollo中部分模拟模式?,graphql,apollo,apollo-server,Graphql,Apollo,Apollo Server,我试图模仿下面的联系人类型的一小部分。我的解析器从REST端点返回联系人中除测试之外的所有字段的数据。出于演示目的,我希望能够保留所有其他字段的服务器数据,但只模拟test字段 我定义了以下GraphQL模式: const typeDefs = ` type Contact { id: String, first_name: String last_name: String middle_name: String

我试图模仿下面的
联系人类型的一小部分。我的解析器从REST端点返回
联系人
中除
测试
之外的所有字段的数据。出于演示目的,我希望能够保留所有其他字段的服务器数据,但只模拟
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
属性仍然返回默认字符串mock of
Hello World
,而不是我尝试的模拟
此数据被模拟

我知道模拟设置正确,因为我可以删除
mockEntireSchema
config,并且模拟数据显示正确


这是可能的吗?
mockEntireSchema
和mock的行为通常不支持这一点吗?

我没有尝试过,但对我来说,它似乎应该可以工作(你所描述的)。但由于没有,一个可能的解决方法是只为
测试
字段添加一个字段解析器:

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)
  }
};

根据,您希望将
mockEntireSchema
保留为
false
,并创建一个
mock
对象,其中包含仍要模拟的组件。所有其他冲突解决程序将按其存在的方式使用。但是,您定义的任何模拟都将被使用,因此返回
联系人
类型的查询解析程序将永远不会被使用,因为您已将
联系人
定义为模拟。

我现在认为这实际上是Apollo中的一个bug。当您使用
preservesolver:true
mockEntireSchema:false
(它们是相同的)时,它不会覆盖现有的解析程序,但是,我根据我的模拟配置筛选出了这些解析程序,因此它们不会首先加载


这使得部分模拟在原则上起作用。但是,错误在于嵌套的
()=>MockList(100)
调用在graphql包中抛出错误,因为graphql将
MockList对象解释为“不可编辑”。这不会发生在
preservesolvers:false

中,您描述的不是正在发生的事情。无论我使用的是
mockEntireSchema
true还是false,Apollo都会模拟所有“端点”。唯一的区别是,如果我选择
mockEntireSchema:true
,它将用我的模拟冲突解决程序覆盖现有的冲突解决程序。如果为false,它将忽略我提供的模拟解析程序,而支持现有的解析程序,然后使用默认值(Hello world等)对其进行模拟。这里的问题相同:在阿波罗服务器上打开了一个问题