RhinoMocks2和NMock2相比较NMock都学习了JMock强大的Constraints.
Constraint: Example: Object Anything Is.Anything() Equal Is.Equal(3) Not Equal Is.NotEqual(3) or !Is.Equal(3) Null Is.Null() Not Null Is.NotNull() Type Of Is.TypeOf(typeof(string)) Greater Than Is.GreaterThan(10) Greater Than Or Equal Is.GreaterThanOrEqual(10) Less Than Is.LessThan(10) Less Than Or Eqaul Is.LessThanOrEqual(10) Property Equal To Value Property.Value("Length",0) Null Property.IsNull("InnerException") Not Null Property.IsNotNull("InnerException") List Is In List List.IsIn(4) One Of List.OneOf(new int[]{3,4,5}) Equal List.Equal(new int[]{4,5,6}) Text Starts With Text.StartsWith("Hello") Ends With Text.EndsWith("World") Contains Text.Contains("or") Like Text.Like("Rhino|rhino|Rhinoceros|rhinoceros" ) Operator Overloading And - operator & Text.StartsWith("Hello") & Text.Contains("bar") Or - operator | Text.StartsWith("Hello") & Text.Contains("bar") Not - operator ! !Text.StartsWith("Hello")
[the parameter is a collection that contains this value]
[parameter equal to one of the objects in this list]
[perform regular expression validation]
RhinoMocks2的缺点:
对于所有的mock对象, 你必须预计(Expect)到它在执行时(excute)的所有将发生方法, 否则都会导致测试无法通过, 唯一例外的一点就是NMock对此没有要求.当你把NMockTest的第70行注释掉,测试依然通过.
不知道是不是因为这样的原因RhinoMocks2并没有提供Expect.Never.On这样的语法. 也就是我无法保证某个方法不被调用. 而其他的框架都实现了类似的功能.
我的期望:
Expect.On(subMock).Call(subMock.MultiplyTwo(5)).Return(10);
其中On方法似乎显的多余.不知道能不能改成下面这个样子.
Expect.Call(subMock.MultiplyTwo(5)).Return(10);
甚至于变成这样
subMock.MultiplyTwo(5)==10;
当然Expectation的模型应该保留,因为对于某些需要指定异常约束的情况你是无法通过subMock.MultiplyTwo(5)==10;这样的形式来描述的.
虽然Expect的语法的语义比较强, 但是在书写的时候还是比较麻烦.不知道能不能有更好的模型.
Mock对象在测试时无法调试, 这点和NUnit那样基于状态的测试相比差了点, 只能靠自己动脑子了.