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?.
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 :
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.
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.
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.
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;
});
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With