Limits of testing HA with a single server replica set?
You can certainly test standard replica configuration and deployment issues on a single server, but some scenarios are easier to set up with multiple environments (even if those happen to be VMs or containers on the same host server). The rs.freeze() and rs.stepDown() commands help control election outcomes; for HA testing I expect you'd be randomly shutting down or firewalling mongod processes to confirm the outcome is as you anticipated.


  Are there specific scenarios that I wouldn't able to simulate with things like rs.stepDown() and rs.freeze()? Or by stopping services?


It depends how thoroughly you are trying to test. VMs definitely provide more flexibility -- for example, if you want to test possible effects of clock skew or resource limitations.

To simulate more real-world deployments you should also consider network simulation using a tool like mongodb-bridge. There are common network issues like latency (particularly for geographically distributed deployments) as well as more insidious problems like asymmetric routing or connectivity.

If you are considering HA from the application point of view, you should test using an application/driver with an appropriate write concern. For example, you may want to ensure that an application using a write concern of w:majority can still get acknowledged writes in the event of node failure. With a Primary/Secondary/Secondary replica set any single node can fail and there will still be two data-bearing nodes to satisfy w:majority; if you have a Primary/Secondary/Arbiter replica set, the failure of a single data-bearing node will still allow a primary to be elected, but w:majority write concern cannot be satisfied.

If you want some ideas on replication scenarios to test, an interesting starting point might be the JavaScript test suite used in the MongoDB code base: https://github.com/mongodb/mongo/tree/master/jstests/replsets.