错误:预期对标准“按功能匹配:”的一个匹配请求,未找到

时间:2018-12-30 07:23:33

标签: unit-testing angular6 karma-jasmine angular7

我有一个要测试的userService.spec.ts文件。代码按这种方式进行。它调用了一个调用ADMIN_API_URL的get函数。我尝试测试给定的文件,但标题中提到了错误。 我的 user.service.spec.ts 文件。

 describe('Service: User service', () => {
 let httpMock: HttpTestingController;
 let userService: UserService;
 let url: string;

  beforeEach(() => {
   TestBed.configureTestingModule({
    imports: [HttpClientTestingModule],
     providers: [
    { provide: AUTH_API_URL, useValue: 'https://auth.example.com/api/' 
      },
    { provide: SSO_API_URL, useValue: 'https://sso.example.com/auth/api/' },
    { provide: WIT_API_PROXY, useValue: 'https://wit.example.com/api/'},
    { provide: ADMIN_API_URL, useValue: 'https://admin.example.com/api/'},
    { provide: REALM, useValue: 'realm' },
    Broadcaster,
    Logger,
    AuthenticationService,
    HttpHandler,
    UserService
  ]
});
httpMock = TestBed.get(HttpTestingController);
url = TestBed.get(ADMIN_API_URL);
userService = TestBed.get(UserService);
 });

 it('Get user by user name returns valid user', (done) => {
const testUser = [{
  'attributes': {
    'fullName': 'name',
    'imageURL': '',
    'username': 'myUser'
  },
  'id': 'userId',
  'type': 'userType'
}];
userService.getUsersByName('name').subscribe((user) => {
  expect(user[1].id).toEqual('userId');
  done();
});
const req = httpMock.expectOne(request => request.method === 'GET'
&& request.url === `${url}search/users?q=name`);
req.flush({data: testUser});
 });
});

我尝试测试我脑海中所有的东西,但仍然找不到我的代码出了什么问题。我犯了任何愚蠢的错误吗?

3 个答案:

答案 0 :(得分:1)

就我而言,经过测试的服务依赖于我嘲笑的其他服务。模拟的依赖项错过了被测试的服务调用的模拟功能。这个错误被默默地吞噬了。

添加了模拟功能后,它便开始正常工作。

答案 1 :(得分:0)

编辑:您描述的问题可能是由“无声”问题引起的。我的经验如下。

首先检查诸如AuthenticationService之类的服务依赖项。

您创建的请求可能会在管道中进一步与这些依赖项进行交互,并且可能之前被拒绝,甚至到达Angular的HTTP客户端!

这样,HttpTestingController不会注册该请求,您将在测试中得到找不到任何内容

答案 2 :(得分:-1)

很可能URL不匹配。 ExpectOne条件(request.url === $ {url} search / users?q = name )可能失败。您可以记录您的模拟请求URL来查看实际的URL。

        const req = httpMock.expectOne(request => {
    console.log("url ", request.url); return true;
});