我正在学习 Rhino Mocks
并且不知道如何模拟工厂:
我有一个由 IOC 使用的 IViewModelFactory 接口(interface)
public interface IViewModelFactory
{
T Create<T>() where T : IViewModel;
T Create<T>(int Id) where T : IViewModel;
}
目前我创建模拟:
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 :
_viewModelFactory.Get<ViewModel1>(25);
这可以 mock 吗?
最佳答案
让我们看看我是否理解您的问题..您有不同的解决方案:
如果您已经知道将要使用的 ID,则可以执行以下操作:
var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
var id = 1;
viewModelFactory.Stub(x => x.Create<ViewModel1>(id))
.Return(new ViewModel1(id));
如果您不知道 id 但您不关心将使用哪个,因为您将始终返回具有相同 id 的 View 模型,您可以这样做:
var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
viewModelFactory.Stub(x => x.Create<ViewModel1>(0))
.IgnoreArguments()
.Return(new ViewModel1(10));
如果您想使用您在定义测试时不知道的 id 创建一个 View 模型:
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);
});
注意:我现在无法测试代码,但我认为它应该可以工作!
关于c# - 用参数模拟工厂,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19928941/