Comments (5)
It might be that "tip" is outdated or simply wrong. Currently, vitest --typecheck
cannot test single test file in both mode and prioritized typecheck mode. See also:
I'm not sure what's the best way to do this currently other than running vitest twice.
from vitest.
I'm not sure what's the best way to do this currently other than running vitest twice.
Note that // @ts-expect-error
can hide typos in type names as well. Those are stripped entirely. Nor executing the test files, neither running vitest
twelve times can help.
Solution: the old good Separation of Concerns principle. Use JavaScript testing tool to test runtime behaviour. Use specialised type testing tool to test types. There are at least two type testing tools which offer a type error assertion instead of // @ts-expect-error
. The comment belongs to compiler, it is not meant for testing types.
from vitest.
There are at least two type testing tools which offer a type error assertion instead of
// @ts-expect-error
.
Could you please refer to these tools for clarity?
With Vitest, I gravitated towards @ts-expect-error
as the most readable solution, and I will probably keep using it despite the possible issues highlighted, unless said tools are better, because the alternative was rather messy.
A minimal example of my use case, for context:
// to test against
function argFail<const T extends [1, never, 3]>(...arg: T) {}
//#region readable
argFail(
1,
// @ts-expect-error invalid
2,
3,
);
//#endregion
//#region messy, but intended way of testing, with expect-type?
type argFail_params = Parameters<typeof argFail>;
const arg = [1, 2, 3] as const;
expectTypeOf(arg[1]).not.toMatchTypeOf<argFail_params[1]>();
//#endregion
In a realistic scenario, argFail
's arg: T
parameter might also become too complex to properly extract it and make it testable without going somewhat mad.
Much more practical to just test a natural invocation of argFail
with a not-quite-intended @ts-expect-error
, that is resilient to refactors, than to bring in what I would consider a brittle and indirect way of expressing what I want to test.
from vitest.
Could you please refer to these tools for clarity?
Sure. I had in mind:
tsd
(not recommended: still maintained, but it did not receive any significant improvement for very long time);- and
tstyche
(my own project: does more thantsd
could and I work on more features).
To be honest, a type error assertion is not an ideal solution too. It would be the best to have .not.toBeCallableWith()
matcher. As you know, expect-type
has .toBeCallableWith()
, but it does not work with function overloads and generic functions. They do not implement .not.toBeCallableWith()
at all, but suggest to use // @ts-expect-error
.
This matcher is complex. The most interesting part is to resolve argument types of generic functions. Programatically this is possible and I have a working prototype. That means that eventually tstyche
will have .not.toBeCallableWith()
with support for overloaded and generic functions.
from vitest.
Cheers, as I suspected there's not really a canonical way to go about this, and so I will stick to @ts-expect-error
.
I will leave it to the maintainers to decide about the tip in the docs, but if I may provide input, it did waste me some time to realize that it's not working as intended, and at least some warning around it would be a welcome addition while the upstream issues are resolved.
from vitest.
Related Issues (20)
- Regression in v1.5.1: TypeError: Invalid value used as weak map key HOT 3
- Stack overflow caused by large output HOT 2
- 1.5.1 Throws Unhandled Rejections TypeErrors in coverage-instanbul - 1.4.0 works fine HOT 5
- `resolveId` is called before `buildStart` with enforce: 'pre' HOT 5
- 1.5.1 TypeError: WeakMap key null must be an object or an unregistered symbol HOT 1
- Object Properties are ignored in expect when there is a Symbol.iterator HOT 6
- vite-node should have different behavior with env vars than vite HOT 1
- TypeError: Cannot redefine property after upgrading to v1.5.0 HOT 2
- Function calls that doesn't match signatures result in test success HOT 4
- Exclude {test,spec}-d files from coverage by default HOT 4
- Docs: mocks cheatsheet hard to read
- Mocking dependencies of pnpm monorepo packages doesn't work as expected HOT 2
- Only setting `CI=1` prints the stdout HOT 4
- Document how to mock a class, an instance, a method in a class HOT 1
- Coverage of types files can end up with a fatal error: `Cannot read properties of undefined (reading 'endCol')` HOT 2
- Virtual modules in lib mode no longer work HOT 6
- vitest --ui fails to run on Windows 11 ARM64 HOT 2
- Add a reason parameter in expect HOT 1
- Mocking changes returned promises HOT 3
- Add "file" attribute to vitest JUnit reporter test case XML elements HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from vitest.