RhinoMock - 一种方法中的多种期望 - 最佳实践

时间:2011-01-03 20:27:25

标签: rhino-mocks

我想知道你们是如何处理这样的事情的。什么是最佳实践..

要知道我在演示者对象上有一个名为Load的方法

首先,该方法如下所示:

public void Load(ViewMode mode, int? id)
{
     if(mode == ViewMode.Modify)
          view.CurrentEntity = model.GetMyEntityById(id.GetValueOrDefault(0));
     else
          view.CurrentEntity = model.CreateNewEntity();
}

为了测试这段代码我使用RhinoMock进行了2次测试来设置期望

[TestMethod]
public void Load_ShouldCallModelToGetEntityIfViewModeEqualsModify()
{
     IView view = _mockery.StrictMock<IView>();
     IModel model = _mockery.StrictMock<IModel>();

     Entity e = new Entity()

     using(_mockery.Ordered())
     {
          Expec.Call(model.GetMyEntityById(3)).Return(e)
          view.CurrentEntity = e;
     }
     _mockery.ReplayAll()

    Presenter sut = new Presenter(view, model);

    sut.Load(ViewMode.Modify, 3);

    _mockery.VerifyAll();
}

然后我又有另一个测试来测试ViewMode.Add ...

的另一条路径

所以我的问题是我是否将演示者的Load方法更改为

public void Load(ViewMode mode, int? id)
{

     view.CollectionA = model.GetListOfA();  <------ADDED THIS 
     view.CollectionB = model.GetListOfB();  <------AND THIS

     if(mode == ViewMode.Modify)
          view.CurrentEntity = model.GetMyEntityById(id.GetValueOrDefault(0));
     else
          view.CurrentEntity = model.CreateNewEntity();
}

现在我必须在我之前的所有测试中添加对两个GetList方法的期望,否则它将导致预期0实际1.此外,我将不得不更改我的测试名称,因为在测试中我期望的不仅仅是调用模型以通过其ID获取实体。

那是否有最好的实践。当我添加对某些模拟的调用时,更改我所有的测试是正确的做事方法,或者有一种方法可以期待一些调用以前的测试并添加另一个测试,如下所示: [测试方法] public void Load_ShouldCallModelToObtainAListOfA();

并且它不会使我的其他测试失败。

我知道这是一个模糊的问题,但如果有人理解我的要求,请告诉我你是如何通过行为测试处理这种情况的。

非常感谢你 违反

1 个答案:

答案 0 :(得分:1)

看起来您正在编写单元测试以确保调用某些方法来实现您想要的结果。不要这样做。它使您的测试变得非常脆弱,并使重构变得困难。

相反,只需测试您的Load方法的行为,而不是实施的行为方式。从查看Load方法,它会填充几个集合并设置CurrentEntity属性。因此,您的测试应该确保在调用Load方法之后,设置集合并将CurrentEntity设置为您期望的那个。

确定模型以返回模型对象上调用的各种方法的一些预设响应,然后运行测试。验证您的视图中是否包含预设值。