用参数模拟工厂

时间:2013-11-12 12:15:44

标签: c# unit-testing rhino-mocks factory

我正在学习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);

可以模仿吗?

1 个答案:

答案 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);
                    });

注意:我现在无法测试代码,但我认为它应该可以运行!