1

这个问题很简单。我从来没有真正喜欢过原始测试在 Angular(TestBed部分)中的工作方式,所以我一直以经典的方式完成它:使用ts-mockito进行模拟。不TestBed,无需配置,零混乱。我什至用 Jest 代替 Karma/Jasmine。

但是当谈到嘲笑时ActivatedRouter,我总是遇到麻烦,因为我猜你们很多人都在那里。我见过的一种解决方案是拥有一个具有大量属性的对象ActivatedRouter,并替换您要模拟的属性的值。该解决方案非常烦人,而且非常不可持续。

另一种解决方案是被迫使用TestBed我不太喜欢的,并执行以下操作:

providers: [
        {
          provide: ActivatedRoute,
          useValue: {
            snapshot: {
              paramMap: {
                get: () => 'foo'
              },
              queryParamMap: {
                get: () => 'bar'
              }
            }
          }
        }
      ]

这个其实还不错,但正如我所说,它迫使你使用TestBed. 那么,如何在ActivatedRoute不使用的情况下模拟行为TestBed

4

1 回答 1

1

所以,今天我想出了一种不用TestBed.

这将是一个完整测试如何使用ts-mockito的小例子:

function setup() {
  const route = mock(ActivatedRoute);
  const routeInstance = instance(route);
  Object.defineProperty(routeInstance, 'snapshot', {
    writable: true,
    configurable: true,
    value: {
      paramMap: {
        get: () => 'someParam'
      },
      queryParamMap: {
        get: () => 'someQueryParam'
      }
    }
  });

  return {
    sut: new MyComponent(routeInstance),
    route
  };
}

describe('MyComponent', () => {
  it('should get param and query param from activated route', async () => {
    const { sut, route } = setup();

    const actualParam = sut.getParam();
    expect(actualParam).toBe('someParam');

    const actualQueryParam = sut.getQueryParam();
    expect(actualQueryParam).toBe('someQueryParam');
  });
});
于 2020-09-03T09:00:28.670 回答