Angular 如何在jest单元测试中模拟文档依赖注入?

Angular 如何在jest单元测试中模拟文档依赖注入?,angular,jasmine,jestjs,Angular,Jasmine,Jestjs,我已经实现了一个名为“A”的组件,它依赖于文档对象。 组件还有一个名为onClose()的方法,该方法使用文档对象服务使用queryselector()获取元素 我的单元测试代码如下所示:- const mockDocument = { querySelector: (val): any => { return [ { parentNode: val } ]; } }; beforeEach(a

我已经实现了一个名为“A”的组件,它依赖于文档对象。 组件还有一个名为onClose()的方法,该方法使用文档对象服务使用queryselector()获取元素

我的单元测试代码如下所示:-

const mockDocument = {
    querySelector: (val): any => {
      return [
        {
          parentNode: val
        }
      ];
    }
  };
beforeEach(async(() => {
    TestBed.configureTestingModule({
  providers: [{ provide: DOCUMENT, useValue: mockDocument }]
});
}));
我犯了一个错误

此._doc.queryselectoral不是函数

谁能告诉我哪里有问题吗?
模拟特定注入令牌是否有任何问题?

如果您注意到错误显示为
this.\u doc.querySelector all
但您只模拟了
querySelector
方法。如果您模拟
querySelectorAll
方法,它应该也能工作。

我在代码中只使用querySelector,从未使用querySelectorAll方法,这就是为什么我没有在模拟中添加它。@AdityaVashishtha我不是100%确定,但有可能TestBed在内部使用了该文档,而通过使用一个mock覆盖它,您正在破坏它的内部行为。您必须从错误中检查堆栈跟踪,以查看调用querySelectorAll的位置。你在开玩笑还是因果报应?在Karma中,我认为您不需要模拟文档,因为测试是在浏览器中运行的。我使用的是jest而不是Karma,我检查的代码我只在指定的方法中使用dom方法queryselector(),而不使用任何其他方法。@AdityaVashishtha如果删除模拟提供程序会发生什么?它有用吗?Jest开箱即用地运行jsdom,因此所有domapi都可以工作,而无需在测试中模拟它。我有一种感觉,TestBed已经提供了document对象。当我删除它并再次运行测试时,它会给我使用querySelector()方法的行带来错误,如果我监视这个方法并提供模拟实现,那么我不确定,但下一个测试用例正在崩溃,即使它是空的,它也会给出错误“parent.appendChild不是函数”使用
beforeach(()=>{
和not
beforeach(async(()=>{
),看看单元测试是否有效?
const mockDocument = {
    querySelector: (val): any => {
      return [
        {
          parentNode: val
        }
      ];
    }
  };
beforeEach(async(() => {
    TestBed.configureTestingModule({
  providers: [{ provide: DOCUMENT, useValue: mockDocument }]
});
}));