In real redis, a command that modifies a key invalidates a WATCH on that key, even if the value remains the same. fakeredis currently compares the value before and after, so it won't invalidate the watch. On the other hand, fakeredis will invalidate the watch if the key expires (because it no longer exists), but real redis won't (see https://code.google.com/archive/p/redis/issues/270).
Fixing this will be a major endeavour, since it will require investigating exactly what conditions trigger expiry in redis, and most likely modifying every single write command to trigger expiry.