我正在学习Rhino Mocks
并且不知道如何模拟工厂: 我有一个由IOC
使用的IViewModelFactory接口public interface IViewModelFactory
{
T Create<T>() where T : IViewModel;
T Create<T>(int Id) where T : IViewModel;
}
目前我创建了mock:
var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
viewModelFactory.Stub(x => x.Create<ViewModel1>())
.Return(new ViewModel1());
ViewModel1是一个类:
public class ViewModel1:BaseViewModel,IViewModel
{
private int _id;
public int ID
{
get { return _id;}
set {
if (_id==value) return;
_id= value;
RaisePropertyChanged(()=>ID)
}
}
public ViewModel1()
{
ID=0;
}
public ViewModel1(int id)
{
ID=id;
}
}
这适用于
_viewModelFactory.Get<ViewModel1>();
但不知道如何创建Stub for like:
_viewModelFactory.Get<ViewModel1>(25);
可以模仿吗?
答案 0 :(得分:3)
让我们看看我是否理解了你的问题..你有不同的解决方案:
如果您已经知道将要使用的ID,您可以这样做:
var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
var id = 1;
viewModelFactory.Stub(x => x.Create<ViewModel1>(id))
.Return(new ViewModel1(id));
如果你不知道id,但是你不关心将使用哪个,因为你总是会返回具有相同id的viewmodel,你可以这样做:
var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
viewModelFactory.Stub(x => x.Create<ViewModel1>(0))
.IgnoreArguments()
.Return(new ViewModel1(10));
如果你想创建一个具有你得到的id的viewmodel,即使你在定义测试时不知道它:
var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
viewModelFactory.Stub(x => x.Create<ViewModel1>(Arg<int>.Is.Anything))
.Return(null)
.WhenCalled(x => {
var id = (int)x.Arguments[0];
x.ReturnValue = new ViewModel1(id);
});
注意:我现在无法测试代码,但我认为它应该可以运行!