diff --git a/graphene/types/schema.py b/graphene/types/schema.py index bceede6a..0f40afe5 100644 --- a/graphene/types/schema.py +++ b/graphene/types/schema.py @@ -397,6 +397,9 @@ def resolve_type(self, resolve_type_func, type_name, root, info, _type): if inspect.isclass(type_) and issubclass(type_, ObjectType): return type_._meta.name + if isinstance(type_, str): + return type_ + return_type = self[type_name] return default_type_resolver(root, info, return_type) diff --git a/graphene/types/tests/test_interface.py b/graphene/types/tests/test_interface.py index 3dd4fc4f..10263262 100644 --- a/graphene/types/tests/test_interface.py +++ b/graphene/types/tests/test_interface.py @@ -202,3 +202,42 @@ def resolve_test(_, info): ) assert not result.errors assert result.data == {"test": {"__typename": "MyTestType1", "type": "foo"}} + + +def test_resolve_type_custom_string(): + class MyInterface(Interface): + field2 = String() + + @classmethod + def resolve_type(cls, instance, info): + if instance["type"] == 1: + return "MyTestType1" + return "MyTestType2" + + class MyTestType1(ObjectType): + class Meta: + interfaces = (MyInterface,) + + class MyTestType2(ObjectType): + class Meta: + interfaces = (MyInterface,) + + class Query(ObjectType): + test = Field(MyInterface) + + def resolve_test(_, info): + return {"type": 1} + + schema = Schema(query=Query, types=[MyTestType1, MyTestType2]) + + result = schema.execute( + """ + query { + test { + __typename + } + } + """ + ) + assert not result.errors + assert result.data == {"test": {"__typename": "MyTestType1"}}