4

我正在学习 Rhino Mocks

并且不知道如何模拟工厂:我有一个 IOC 使用的 IViewModelFactory 接口

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>();

但不知道如何为之类创建存根:

  _viewModelFactory.Get<ViewModel1>(25);

可以嘲笑吗?

4

1 回答 1

3

让我们看看我是否理解您的问题。您有不同的解决方案:

如果您已经知道要使用的 ID,您可以这样做:

var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
var id = 1;
viewModelFactory.Stub(x => x.Create<ViewModel1>(id))
                   .Return(new ViewModel1(id));

如果您不知道 id 但您不关心将使用哪一个,因为您将始终返回具有相同 id 的视图模型,您可以这样做:

var _viewModelFactory = MockRepository.GenerateStub<IViewModelFactory>();
viewModelFactory.Stub(x => x.Create<ViewModel1>(0))
                   .IgnoreArguments()
                   .Return(new ViewModel1(10));

如果您想创建一个带有 id 的视图模型,即使您在定义测试时不知道它:

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

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

于 2013-11-12T12:33:38.280 回答