code: def test_FeatureFetcher_hetero():
      graph = get_hetero_graph()
      a = torch.tensor([[random.randint(0, 10)] for _ in range(2)])
      b = torch.tensor([[random.randint(0, 10)] for _ in range(3)])
  
      features = {}
      keys = [("node", "n1", "a"), ("node", "n2", "a")]
      features[keys[0]] = gb.TorchBasedFeature(a)
      features[keys[1]] = gb.TorchBasedFeature(b)
      feature_store = gb.BasicFeatureStore(features)
  
      itemset = gb.ItemSetDict(
          {
              "n1": gb.ItemSet(
                  torch.LongTensor([0, 1]), names="seed_nodes"
              ),
              "n2": gb.ItemSet(
                  torch.LongTensor([0, 1, 2]), names="seed_nodes"
              ),
          }
      )
      item_sampler = gb.ItemSampler(itemset, batch_size=2)
      num_layer = 2
      fanouts = [torch.LongTensor([2]) for _ in range(num_layer)]
      sampler_dp = gb.NeighborSampler(item_sampler, graph, fanouts)
      fetcher_dp = gb.FeatureFetcher(
          sampler_dp, feature_store, {"n1": ["a"], "n2": ["a"]}
      )
  
      assert len(list(fetcher_dp)) == 3
  
file_path: dgl/tests/python/pytorch/graphbolt/test_feature_fetcher.py
imports: import random
  from enum import Enum
  import dgl.graphbolt
  import pytest
  import torch
  from torchdata.datapipes.iter import Mapper
  from .None import gb_test_utils
label_desc: Use image node_id 5 for calling a global function with example usage: test_FeatureFetcher_hetero() without return types