Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error: Expected one matching request for criteria "Match by function: ", found none

I have a userService.spec.ts file that I want to test.The code goes this way. It calls a get function that calls the ADMIN_API_URL.I tried testing the given file but got an error that is mentioned in the title. My user.service.spec.ts file.

 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});
 });
});

I tried testing all the things that I had in my mind but still can't find what is wrong with my code.Am I doing any silly mistake?.

like image 450
Rajat Singh Avatar asked Dec 30 '18 07:12

Rajat Singh


People also ask

What does this error mean - expected one matching request found none?

Error: Expected one matching request [...], found none. This simply means that your URL doesn't match. Or you can simply try to match the request. Other solution : since you rely on environment variables, you can run this test instead :

Can I delete the @matchifang expectone parameter?

You can delete it afterwards. @matchifang expectOne (url: string) is one of the signatures : you have 3. One of them is expectOne (matchFn: Function) : you can provide a callback function, that has an HttpRequest object as the parameter : by logging this object, you can get the URL that has been called.

Is'match by function'a bug?

This is not a bug. I had similar issue "Match by function: ", found none. It is solved after i added empty handler for then () in-case the method returns a Promise and subscribe () in-case method returns a Observable.

Why did expectone fail with a found none error?

If your expectOne failed with a "found none", and verify did not fail, then your service must not actually have called http.put (). Add some logging or step through the test in a debugger to see what's actually happening. As other answers have pointed out, this could be due to timing issues.


2 Answers

Most likely the URLs are not matching. The expectOne condition (request.url === `${url}search/users?q=name`) is likely failing. You can log your mock request URL to see what the actual URL is.

const req = httpMock.expectOne(request => {
    console.log("url: ", request.url);
    return true;
});
like image 85
Atif Majeed Avatar answered Sep 17 '22 19:09

Atif Majeed


In my case the tested service had a dependency on some other service, which I mocked. The mocked dependency missed mocked function which was called by the tested service. This error was silently swallowed.

Once the mocked function has been added, it started to work correctly.

like image 31
Felix Avatar answered Sep 18 '22 19:09

Felix