Moq has been getting some press lately because it’s the newest mock framework on the block. I think it’s certainly interesting and I’ll have more to say on it later, but I wanted to briefly complain about one aspect real quick.
Moq touts that it has a more simplified API when compared to something like Rhino.Mocks. The API has a single entry point which certainly aids discoverability, but I question one of the design decisions. I remember seeing someone say that Rhino had too many types of mocks and that that was confusing. Well, I don’t think it has this many different Mock Behaviors:
public enum MockBehavior { Strict, Normal, Relaxed, Loose, Default = Normal, }
Why have this many? Does anyone know what they do just by looking at them? At least they’re documented, but the docs are quite a mouthful:
public enum MockBehavior { ////// Causes the mock to always throw /// an exception for invocations that don't have a /// corresponding expectation. /// Strict, ////// Matches the behavior of classes and interfaces /// in equivalent manual mocks: abstract methods /// need to have an expectation (override), as well /// as all interface members. Other members (virtual /// and non-virtual) can be called freely and will end up /// invoking the implementation on the target type if available. /// Normal, ////// Will only throw exceptions for abstract methods and /// interface members which need to return a value and /// don't have a corresponding expectation. /// Relaxed, ////// Will never throw exceptions, returning default /// values when necessary (null for reference types /// or zero for value types). /// Loose, ////// Default mock behavior, which equals . /// Default = Normal, }
I’m of the opinion that you should only have one type of Mock, and that’s what Rhino calls Dynamic and Moq calls Loose. I described why here. If I wanted to simplify mocking, I’d start here.