- Stub:用返回特定结果的代码替换方法,阻断对原来方法的调用
- Mock:A stub with an expectations than the method gets called.可以像stub一样伪造方法,阻断对原来方法的调用,expectation是说它不仅构造了这个方法,还期望你(必须)调用这个方法,返回给定的结果,如果没有调用,这个test就failed了
- Rhino.Mocks支持三种基本的Mock对象:
- Strict Mock:需要提供替代的implementations for each method/property used on the mock,如果没有提供,就会抛异常.对应的函数为GenerateStrictMock<T>
- Dynamic Mock:test中调用的method/property如果没有提供替代实现将会返回默认值,对应的函数为GenerateMock<T>
- Partial Mock:只替换部分实现,如函数A中调用函数B,可以Mock函数B 返回特定值,A中的其他代码逻辑不变,对应的函数为GenerateStrictMock<T>
- Rhino.Mocks只能mock\stub virtual members of a real class,如:
MockRepository mocks = new MockRepository();
ArrayList list = mocks.CreateMock<ArrayList>();
最好是mock\stub interface/abstract - 预期的实现由两种方式:
- 先执行Expected,再执行Replay
- Using(*.Record()){执行Expected}
- stubOjbect.Stub().Return():在第一次调用时返回给定的值,下面的函数可以用在Stub和Return之间:
- stubObject.Stub(Func).Repeat.Any().Return(provided value):每次调用都返回给定值
- stubObject.Stub(Func).Repeat.Once().Return(provided value):第一次调用返回给定值
- stubObject.Stub(Func).Repeat.Times(10).Return(provided value):前10次调用返回给定值
- stubOjbect.Stub(Func).IgnoreArguments().Return(provided value):不管Func的输入参数是什么都返回给 定值
- 参数限制,放在Stub和Return函数中间:
- Arg<int>.Is.GreaterThanOrEqual(0)
- Arg<decimal>.Is.NotEqual(0)
- Arg<List<string>>.List.ContainsAll(new List<string>("foo","bar"))
- Arg<Object>.Is.NotNull
- Arg<Object>.Is.Anything
- 对象的属性作参数:
_mockDAO.Stub(x => x.SomeMethod(myObject)).Constraints(Property.Value("IsSomethingICareAbout", true)
.Return("foo");
表示只有当属性IsSomethingICareAbout为True时才返回指定值 - Return()返回一个简单的值,可以用Do()提供完整实现,可以定义委托并调用,也可以用lamda表达式
-
_mockDAO.Stub(dao => dao.GetRecordFromDatabase(0)) .IgnoreArguments() .Repeat.Any() .Do((Func<int, ImportantData>)(input => new ImportantData { Name = "Orignal Name", RecordId = input }));
- Throw(Exception):抛出一个异常
- Testing Non-Public Members:
- 在要测试的assembly的AssemblyInfo.cs文件中添加两个InternalsVisibleToAttributes,one for unit test assembly,one for Rhino.Mocks,强签名的文件必须制定public key
时间: 2024-10-11 07:48:45