-
-
Notifications
You must be signed in to change notification settings - Fork 291
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Sinon Chai calledWithMatch causes structuredClone to error in the test runner #2772
Comments
This is blocking our (@novnc) migration to web test runner, as we make heavy use of sinon. :/ Have you found any way to work around the issue? |
@CendioOssman A quick work around would be to delete the it('stops working when errors', () => {
const sinonSpy = spy();
sinonSpy();
try {
expect(sinonSpy).to.be.calledWithMatch({ foo: 'bar' });
} catch (e) {
delete e.actual;
throw e;
}
}); |
Thanks. That doesn't scale terribly well. And we have 765 such assertions. Any workaround would need to be somewhere more central. :/ |
For a central work around I would implement the work around in a Chai plugin: import { use, Assertion } from 'chai';
import sinonChai from 'sinon-chai';
function overrideCallWithMatch() {
Assertion.overwriteMethod('calledWithMatch', _super => {
return function() {
try {
_super.apply(this, arguments)
} catch (error) {
delete error.actual;
throw error;
}
}
});
}
use(sinonChai);
use(overrideCallWithMatch); Depending on for which Sinon Chai methods you want to implement the work around you can extend the plugin. Would this help you @CendioOssman ? |
I have the same issue. This is an issue with any value that My current workaround is to lock |
I was running into this with Both workarounds (wrapper and pinning to |
Possibly. It is a bit annoying that you have to do it for a bunch of methods, though. But I supposed that can be optimized a bit.
This workaround does not work for me. Is there a regression in 0.7.2 that causes this problem? |
I think it is this change that causes the problem: 4a4b699. To be more precise, the usage of |
Hmm.. Very odd that it didn't resolve the issue here for me in that case. @lucaelin, is this issue something you are aware of and working on? |
Hey, thanks for bringing this second issue to my attention, I will see what I can do this weekend, |
From my initial analysis there are multiple different issues at play here:
Fixing 4) should be as simple as catching the clone error and running the original serialization, BUT this would only work if the .actual is not also frozen somewhere within its tree (but I assume that this is an edge case) |
@lucaelin that's great analyses, thanks! do you think you can write some unit tests for each of this use-cases that we need to support? that would be a great way to start a PR, I'd really appreciate it we can then search for some better algorithms for serialization, the one we use currently is taken from https://github.com/davidmarkclements/fast-safe-stringify which hasn't been update for 3 years now, so probably there are better alternativies in the open source world now |
@bashmish Just did, see the draft PR I created. I already had those sitting around from my analysis. I wrote a message on the discord back then, asking how to proceed with this issue, let me paste it here for reference: Original Discord messageI could use some second opinions on this though. As described in my comment on the issue there are 4 cases we need to consider as potential actual values in the message. My problem right now is that the whole serialization implementation makes use of mutation, which in case of objects like window, isn't really ideal and additionally impossible in case of immutability. I previously fixed the immutability by using structuredClone, but that obviously causes problems with non-transferable objects. Looking at this again I think a better way to solve this is to avoid mutation, but this would require replacing the entire algorithm, which may bring other issues to the table. How do you feel about this? I could try to modify the algorithm to shallow clone the problematic objects instead of deep cloning ahead of time? What do you think?This is the problematic code: https://github.com/modernweb-dev/web/blob/master/packages/dev-server-core/src/web-sockets/webSocketsPlugin.ts#L62
The issue would be reliably detecting whats serializable and what is not, walking down into each child node and replacing only those that are not. This gets a bit messy, because it causes more mutation on those objects and might cause further problems down the line. |
See this repo for a reproduction https://github.com/Sanderovich/web-test-runner-called-with-match-error-reproduction.
When an
expect(spy).to.be.calledWithMatch()
is unsuccesful the expect throws anAssertionError
that web test runner can not handle which causes the following exception.The crash seems to happen because of the
actual
property inside theAssertionError
. Theactual
property is set to a function called proxy andstructuredClone
cannot handle functions (https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm).A possible solution could be to
JSON.stringify()
andJSON.parse()
theAssertionError
before thestructuredClone
.The text was updated successfully, but these errors were encountered: