The problem with mutation of object data in Jest
Let’s say we have some method that just set fields like this:
1
2
3
| joinServer({ host, user }) {
user.serverId = host.serverId;
}
|
Here is the example of test of this method:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| it("should move user to host's server", () => {
const user1 = {
id: 1,
serverId: 1,
};
const user2 = {
id: 2,
serverId: 2,
};
joinServer({
host: user1,
user: user2,
});
expect(user2.serverId).toBe(user1.serverId);
});
|
Okay, this test is passed. Now, for some reason, we changed the code of the method. It could be just a mistake. Now it looks like this:
1
2
3
4
5
6
| joinServer({ host, user }) {
// before
// user.serverId = host.serverId;
// after
host.serverId = user.serverId;
},
|
Let’s run test. It’s still successful! But it’s wrong.
To solve this problem we should write fixtures in test like this:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| it("should move user to host's server", () => {
const USER1_SERVER_ID = 1;
const user1 = {
id: 1,
serverId: USER1_SERVER_ID,
};
const user2 = {
id: 2,
serverId: 2,
};
joinServer({
host: user1,
user: user2,
});
expect(user2.serverId).toBe(USER1_SERVER_ID);
});
|
And now test is failed because method has wrong behavior.