@std/expect/fn implement 'jest compatible' mock function
- Dominant language
- TypeScript
- Stars
- 3.6k
- Forks
- 681
- PR merge metrics
- No merged PRs in 30d
Description
**Is your feature request related to a problem? Please describe.**
We do have 'Jest compatible' expect module, but it's `fn` implementation isn't really 'Jest compatible'. We don't have any api to support dynamic change of mock function implementation, and it seems like one of the main parts of being 'Jest compatible' in my opinion. And currently any migration of project from `node` to `deno` will require manual changes in this aspect.
**Describe the solution you'd like**
Provide same functionality [described for Jest's mock function](https://jestjs.io/docs/mock-function-api#reference) for `@stc/expect`'s `fn`, like:
- `mockImplementation()` and `mockImplementationOnce()`, with all of the sugarcoated `mockReturnValue()` etc
- `withImplementation()`.
Would be nice to return resource with `[Symbol.dispose]` from `withImplementation()` when scope callback wasn't provided.
Multiple implementation args of `fn` could be sugarcoated version of doing `fn().mockImplementationOnce().mockImplementationOnce()`.
To be backward compatible and implement `.mockRestore()` we either could use first argument function as `default implementation` or provide `.mockRestore()` only argument instead of multiple
Also would be nice to have `spyOn` implementation compatible with 'Jest' version.
**Describe alternatives you've considered**
Come with any other better api for dynamically changing implementation
**PS**
I'm willing to start working on this issue my self in my free time, if that's ok
**PS**
Referencing my other issue about [incompatibility with `@std/testing/mock`](https://github.com/denoland/std/issues/6289) as I think they are closely related
Just wanted to mention issue about [`@std/expect`'s `fn` not being type safe](https://github.com/denoland/std/issues/6247) here as it seems related in my opinion
Contributor guide
Assessment
This issue has not been assessed yet.